LeetCode第 293 场周赛
# LeetCode第 293 场周赛
5234. 移除字母异位词后的结果数组
每个字符串按字典序排序,通过备份的已排序好的数组进行关系判断。从后依次往前枚举,判断是否能删除该元素,最后剩余的元素即为答案。
class Solution {
public:
vector<string> removeAnagrams(vector<string>& words) {
// 如果长度小于2直接返回
if (words.size() < 2) return words;
// 创建备份数组words,且按字典序排序
vector<string> s(words);
for (int i = 0; i < words.size(); i ++ ) {
sort(s[i].begin(), s[i].end());
}
// 从后往前依次枚举,当前位与前一位是否相同
for (int i = words.size() - 1; i - 1 >= 0; i -- ) {
if (s[i] == s[i - 1]) {
// 相同则删除当前位置的元素
words.erase(words.begin() + i);
}
}
return words;
}
};
6064. 不含特殊楼层的最大连续楼层数
class Solution {
public:
int maxConsecutive(int l, int r, vector<int>& s) {
// 如果楼层全部被占用满,返回0
if (l - r + 1 == s.size()) return 0;
// 首先进行排序
sort(s.begin(), s.end());
int res = 0;
// 枚举每个不包含数组内限定的每个区间
for (int i = 0; i < s.size(); i ++ ) {
// 起初时不会被-1,可能发生重合的情况导致负数
res = max(res, s[i] - l - (i != 0) * 1);
// 每次的l会跳到s[i]的位置, 计算下一个区间长度
l = s[i];
// 避免最后一次的时候l发生越界数值
if (i + 1 >= s.size()) break;
}
// 更新最后一段区间值
if (l < r) res = max(res, r - l);
return res;
}
};
6065. 按位与结果大于零的最长组合
16 & 17 & 62 & 24 = 16 结果大于 0,是因为 16, 17, 62, 24 这几个数都包含 0b10000,那么统计出1的个数最多为多少即可参与按位与的个数,我当时读错题目以为是按位与得到的结果最大,导致一直没想到位运算如何做,所以审题很关键。
class Solution {
public:
int largestCombination(vector<int>& candidates) {
int res = 0;
// 枚举所有数字的每一位上的1的个数
for (int i = 0; i < 30; i ++ ) {
int cnt = 0;
for (auto t : candidates) {
if (t >> i & 1) cnt ++ ;
}
res = max(res, cnt);
}
return res;
}
};
总结wa点:
- 没有考虑在for循环中i的跳转,每次都会自增或自减的性质
- 没考虑特殊情况,开头或结尾要处理好正确逻辑

浙公网安备 33010602011771号