CV也能过的LeetCode周赛,看看你做对了多少题?
2024-01-18 19:27:16
LeetCode 第 336 场周赛回顾:难度递增,第四题是老题
题目分析
各位 LeetCode 爱好者,大家好!我是小彭,今天我们就来聊聊第 336 场周赛的情况。这场周赛总体质量不错,题目难度依次递增,前三道适中,最后一题难度较高。
第一题:统计不开心的朋友
这道题考察数组遍历和计数。给定一个数组,每个元素表示一个朋友的快乐程度。若快乐程度小于或等于 0,则朋友不开心。你的任务是统计不开心朋友的数量。
解法: 遍历数组,统计快乐程度小于或等于 0 的朋友即可。
第二题:找出数组中的最长和谐子序列
这道题考察哈希表和滑动窗口。给定一个数组,和谐子序列是指任意两个相邻元素差值不超过 1 的序列。你的任务是找出数组中最长的和谐子序列的长度。
解法: 使用哈希表记录每个元素的出现次数,再用滑动窗口维护和谐子序列的长度。
第三题:找出丢失的两个数字
这道题考察异或运算和位运算。给定一个范围在 [0, n] 内的数组,缺少两个数字。你的任务是找出这两个丢失的数字。
解法: 对数组所有元素进行异或运算,得到丢失两个数字的异或结果。找到异或结果中最低位的 1,将数组元素分成两组:异或结果最低位为 0 的一组和最低位为 1 的一组。再对两组元素分别进行异或运算,即可得到丢失的两个数字。
第四题:所有子字符串中的元音计数
这道题考察字符串处理和滑动窗口。给定一个字符串,你的任务是统计字符串中所有子字符串中元音出现的次数。
解法: 使用滑动窗口。初始化一个长度为字符串长度的窗口,遍历字符串,每次将当前字符添加到窗口中,统计窗口中元音的出现次数,再将窗口向后移动一位。重复此过程,直到窗口遍历完整个字符串。
CV 能否通过?
最后一题是一道老题,使用 CV 即可通过。不过需要注意,本次周赛的数据范围有所降低,这也使得 CV 更容易通过。
总结
本次 LeetCode 周赛整体质量较高,前三道题目难度适中,最后一题难度较高。如果你能够解决前三道题目,说明你的 LeetCode 水平已经达到了一定的高度。如果你能够解决最后一题,恭喜你,你的 LeetCode 水平已经非常不错了。
建议
如果你想提高自己的 LeetCode 水平,我建议你从以下几个方面入手:
- 多刷题: LeetCode 上有很多高质量的题目,通过刷题可以提高算法和数据结构方面的能力。
- 多总结: 每刷完一道题,都要总结解题思路和技巧,加深理解,提高解题效率。
- 多交流: 与其他 LeetCode 爱好者交流解题思路和技巧,拓宽思路,学习更多新解法。
常见问题解答
1. 本次周赛的难度如何?
本次周赛总体难度中等,前三道题目难度适中,最后一题难度较高。
2. 第四题是否可以 CV 通过?
是的,最后一题是一道老题,使用 CV 即可通过。
3. 如何提高 LeetCode 水平?
通过多刷题、多总结和多交流的方式,可以有效提高 LeetCode 水平。
4. 本次周赛的数据范围是否有影响?
是的,本次周赛的数据范围有所降低,这也使得 CV 更容易通过。
5. 我应该如何选择刷题难度?
根据自身水平选择适合自己的难度,从简单的题目开始逐渐增加难度。
代码示例
// 第一题:统计不开心的朋友
int countUnhappyFriends(int[] friends) {
int count = 0;
for (int friend : friends) {
if (friend <= 0) {
count++;
}
}
return count;
}
// 第二题:找出数组中的最长和谐子序列
int findLHS(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
int maxLen = 0;
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
if (map.containsKey(num - 1)) {
maxLen = Math.max(maxLen, map.get(num) + map.get(num - 1));
}
if (map.containsKey(num + 1)) {
maxLen = Math.max(maxLen, map.get(num) + map.get(num + 1));
}
}
return maxLen;
}
// 第三题:找出丢失的两个数字
int[] findDisappearedNumbers(int[] nums) {
int[] result = new int[2];
int xor = 0;
for (int num : nums) {
xor ^= num;
}
for (int i = 1; i <= nums.length; i++) {
xor ^= i;
}
int lowestBit = xor & -xor;
int group1 = 0, group2 = 0;
for (int num : nums) {
if ((num & lowestBit) == 0) {
group1 ^= num;
} else {
group2 ^= num;
}
}
for (int i = 1; i <= nums.length; i++) {
if ((i & lowestBit) == 0) {
group1 ^= i;
} else {
group2 ^= i;
}
}
result[0] = group1;
result[1] = group2;
return result;
}
// 第四题:所有子字符串中的元音计数
int countVowels(String str) {
int count = 0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') {
count++;
}
}
return count;
}