LeetCode第237场周赛

周赛地址:https://leetcode-cn.com/contest/weekly-contest-237

第一题:判断句子是否为全字母句

判断一个字符串里,是否包含字母表的每个字母,遍历一遍,记录每个字母出现的次数到 c o u n t count count数组中,遍历一遍 c o u n t count count数组,如果有 c o u n t [ i ] = = 0 count[i] == 0 count[i]==0,就返回false,遍历过程中,没有返回false,就返回true。

class Solution {
    public boolean checkIfPangram(String sentence) {
        int[] count = new int[26];
        for (char c : sentence.toCharArray()) {
            count[c - 'a']++;
        }
        for (int i = 0; i < 26; i++) {
            if (count[i] == 0) {
                return false;
            }
        }
        return true;
    }
}

第二题:雪糕的最大数量

用 c o i n s coins coins数量的钱最多可以买多少个雪糕,将雪糕的价格从小到大进行排序,优先选择价格小的,才能使得雪糕的数量最多。
在 c o i n s ≤ 0 coins≤0 coins≤0后,就不要再计数了,必须break,如果 c o i n s < 0 coins<0 coins<0后,依旧执行 c o i n s − = c o s t s [ i ] coins -= costs[i] coins−=costs[i],会出现 c o i n s coins coins负值变正值的情况,然后导致 r e s u l t result result继续累加的情况。

class Solution {
    public int maxIceCream(int[] costs, int coins) {
        Arrays.sort(costs);
        int result = 0, length = costs.length;
        for (int i = 0; i < length; i++) {
            coins -= costs[i];
            if (coins >= 0) {
                result++;
            } else {
                break;
            }
        }
        return result;
    }
}

第三题:单线程 CPU

对原数组按照入队时间进行排序,记录一个currentTime,用优先队列存储currentTime时候,可以执行的所有任务,每次从优先队列里取一个任务执行,同时更新currentTime的值。

class Solution {
    public int[] getOrder(int[][] tasks) {
        int length = tasks.length;
        int[][] array = new int[length][3];
        for (int i = 0; i < length; i++) {
            array[i][0] = tasks[i][0];// 任务入队时间
            array[i][1] = tasks[i][1];// 任务持续时间
            array[i][2] = i;// 序号
        }
        // 按照任务入队时间排序
        Arrays.sort(array, Comparator.comparingInt(o -> o[0]));
        int currentTime = 0, index = 0, i = 0;
        int[] result = new int[length];
        int[] temp;
        // 按照任务持续时间排序,任务持续时间相同的,按照序号排序
        PriorityQueue<int[]> priorityQueue = new PriorityQueue<>((o1, o2) -> {
            if (o1[1] == o2[1]) {
                return Integer.compare(o1[2], o2[2]);
            } else {
                return Integer.compare(o1[1], o2[1]);
            }
        });
        while (!priorityQueue.isEmpty() || i < length) {
            if (!priorityQueue.isEmpty()) {// 取一个执行任务,更新currentTime为执行完的时间
                temp = priorityQueue.poll();
                result[index++] = temp[2];
                currentTime += temp[1];
            } else {// 更新currentTime为所有未执行任务中最早的任务入队时间
                currentTime = array[i][0];
            }
            // 根据currentTime,将可以执行的任务放到优先队列里等待执行
            for (; i < length && currentTime >= array[i][0]; i++) {
                priorityQueue.offer(array[i]);
            }
        }
        return result;
    }
}

第四题:所有数对按位与结果的异或和

首先,我们需要知道一个异或运算的公式: A ⊕ B = A ‾ B + A B ‾ A \oplus B= \overline{A} B+A \overline{B} A⊕B=AB+AB。
然后,从 a r r 1 arr1 arr1中任取一个数字A,从 a r r 2 arr2 arr2中任取两个数字 B B B和 C C C。
( A & B ) ⊕ ( A & C ) = A & B ‾ A & C + A & B A & C ‾ = ( A ‾ + B ‾ ) A & C + A & B ( A ‾ + C ‾ ) = A B ‾ C + A B C ‾ = A ( B ‾ C + B C ‾ ) = A ( B ⊕ C ) \quad(A \& B) \oplus (A \& C) \\= \overline{A \& B}A \& C+A \& B \overline{A \& C} \\=(\overline{A} + \overline{B})A \& C + A \& B(\overline{A} + \overline{C}) \\= A \overline{B} C + AB \overline{C} \\=A(\overline{B}C+B \overline{C}) \\=A(B \oplus C) (A&B)⊕(A&C)=A&BA&C+A&BA&C=(A+B)A&C+A&B(A+C)=ABC+ABC=A(BC+BC)=A(B⊕C)。
同理,在 a r r 1 arr1 arr1中任取两个数字 B B B和 C C C,在 a r r 2 arr2 arr2中任取一个数字 A A A,也可以得到同样的关系。于是,可以推得:
[ a 1 & ( b 1 ⊕ b 2 … … b n ) ] ⊕ [ a 2 & ( b 1 ⊕ b 2 … … b n ) ] … … [ a m & ( b 1 ⊕ b 2 … … b n ) ] = ( a 1 ⊕ a 2 … … a m ) & ( b 1 ⊕ b 2 … … b n ) [a_{1} \& (b_{1} \oplus b_{2}……b_{n})] \oplus [a_{2} \& (b_{1} \oplus b_{2}……b_{n})]……[a_{m} \& (b_{1} \oplus b_{2}……b_{n})]=(a_{1} \oplus a_{2}……a_{m}) \& (b_{1} \oplus b_{2}……b_{n}) [a1​&(b1​⊕b2​……bn​)]⊕[a2​&(b1​⊕b2​……bn​)]……[am​&(b1​⊕b2​……bn​)]=(a1​⊕a2​……am​)&(b1​⊕b2​……bn​)。

class Solution {
    public int getXORSum(int[] arr1, int[] arr2) {
        int num1 = 0, num2 = 0;
        for (int i : arr1) {
            num1 ^= i;
        }
        for (int i : arr2) {
            num2 ^= i;
        }
        return num1 & num2;
    }
}
上一篇:MICCAI 2021 FLARE 挑战:快速和低 GPU 内存腹部器官分割-附代码


下一篇:jBox使用方法