力扣第237场周赛
题一 判断句子是否为全字母句
描述
全字母句 指包含英语字母表中每个字母至少一次的句子。
给你一个仅由小写英文字母组成的字符串 sentence ,请你判断 sentence 是否为 全字母句 。
如果是,返回 true ;否则,返回 false 。
思路
用一个数组记录字母是否出现。
代码
public class N1 {
public boolean checkIfPangram(String sentence) {
int[] book=new int[26];
for (char c:sentence.toCharArray()) book[c-'a']++;
for (int i:book)if(i==0)return false;
return true;
}
}
题二 雪糕的最大数量
描述
夏日炎炎,小男孩 Tony 想买一些雪糕消消暑。
商店中新到 n 支雪糕,用长度为 n 的数组 costs 表示雪糕的定价,其中 costs[i] 表示第 i 支雪糕的现金价格。Tony 一共有 coins 现金可以用于消费,他想要买尽可能多的雪糕。
给你价格数组 costs 和现金量 coins ,请你计算并返回 Tony 用 coins 现金能够买到的雪糕的 最大数量 。
注意:Tony 可以按任意顺序购买雪糕。
思路
贪心求解即可。
代码
public class N2 {
public int maxIceCream(int[] costs, int coins) {
Arrays.sort(costs);
int res=0;
for (int cost:costs){
if(coins>=cost){
res++;
coins-=cost;
}
else break;
}
return res;
}
}
题三 单线程 CPU
描述
给你一个二维数组 tasks ,用于表示 n 项从 0 到 n - 1 编号的任务。其中 tasks[i] = [enqueueTimei, processingTimei] 意味着第 i 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。
现有一个单线程 CPU ,同一时间只能执行 最多一项 任务,该 CPU 将会按照下述方式运行:
如果 CPU 空闲,且任务队列中没有需要执行的任务,则 CPU 保持空闲状态。 如果 CPU 空闲,但任务队列中有需要执行的任务,则 CPU 将会选择 执行时间最短 的任务开始执行。如果多个任务具有同样的最短执行时间,则选择下标最小的任务开始执行。 一旦某项任务开始执行,CPU 在 执行完整个任务 前都不会停止。 CPU 可以在完成一项任务后,立即开始执行一项新任务。 返回 CPU 处理任务的顺序。
思路
- 用优先队列模拟
- 记录下当前时间
代码
public class N3 {
public int[] getOrder(int[][] tasks) {
PriorityQueue<int[]> pq=new PriorityQueue<>((o1, o2) -> {
if(o1[0]==o2[0])return Integer.compare(o1[1],o2[1]);
return Integer.compare(o1[0],o2[0]);
});
PriorityQueue<int[]> task=new PriorityQueue<>(Comparator.comparingInt(o -> o[0]));
for (int i=0;i< tasks.length;i++){
task.add(new int[]{tasks[i][0],tasks[i][1],i});
}
int[] ans=new int[tasks.length];
int idx=0;
int cur=0;
while (!task.isEmpty()||!pq.isEmpty()){
if(pq.isEmpty()&&cur<task.peek()[0]){
cur= task.peek()[0];
}
while (!task.isEmpty()&&cur>=task.peek()[0]){
int[] poll = task.poll();
pq.add(new int[]{poll[1],poll[2]});
}
if(!pq.isEmpty()){
int[] poll = pq.poll();
ans[idx++]=poll[1];
cur+=poll[0];
}
}
return ans;
}
}
题四 所有数对按位与结果的异或和
描述
列表的 异或和(XOR sum)指对所有元素进行按位 XOR 运算的结果。如果列表中仅有一个元素,那么其 异或和 就等于该元素。
例如,[1,2,3,4] 的 异或和 等于 1 XOR 2 XOR 3 XOR 4 = 4 ,而 [3] 的 异或和 等于 3 。 给你两个下标 从 0 开始 计数的数组 arr1 和 arr2 ,两数组均由非负整数组成。
根据每个 (i, j) 数对,构造一个由 arr1[i] AND arr2[j](按位 AND 运算)结果组成的列表。其中 0 <= i < arr1.length 且 0 <= j < arr2.length 。
返回上述列表的 异或和 。
思路
找规律,按位数来看,只有当每个数组在当前位为1的个数都是奇数时,最后的结果才会是1。
代码
public class N4 {
public int getXORSum(int[] arr1, int[] arr2) {
int[] book1=new int[32];
int[] book2=new int[32];
int[] res=new int[32];
setBook(arr1, book1);
setBook(arr2,book2);
for (int i=0;i<32;i++) if(book1[i]%2!=0&&book2[i]%2!=0)res[i]=1;
int ans=0;
for (int i=0;i<res.length;i++) if(res[i]==1)ans+=Math.pow(2,i);
return ans;
}
private void setBook(int[] arr, int[] book) {
for (int num:arr)
{
char[] strs = Integer.toBinaryString(num).toCharArray();
for (int i=0;i<strs.length;i++){
book[strs.length-i-1]+=strs[i]-'0';
}
}
}
}