周赛地址: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;
}
}