LeetCode第 293 场周赛

# 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点:

  1. 没有考虑在for循环中i的跳转,每次都会自增或自减的性质
  2. 没考虑特殊情况,开头或结尾要处理好正确逻辑
posted @ 2022-05-15 12:54  feiyucoder  阅读(32)  评论(0)    收藏  举报