跳转至

力扣第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';
            }
        }
    }
}