讨论/题目交流/🏆 第 168 场力扣周赛/
🏆 第 168 场力扣周赛

欢迎小伙伴们在这里交流分享你的参赛心得以及体验。【前往竞赛

image.png

3 分 - 统计位数为偶数的数字
4 分 - 划分数组为连续数字的集合
6 分 - 子串的最大出现次数
7 分 - 你能从盒子里获得的最大糖果数

展开讨论
力扣 (LeetCode)发起于 2019-12-22
最近编辑于 2019-12-22

第一题:

题解略

class Solution {
public:
    int cal(int n) {
        int ret = 0;
        while (n != 0) {
            ret ++;
            n /= 10;
        }
        return ret;
    }
    int findNumbers(vector<int>& nums) {
        int ret = 0;
        for (auto& x: nums) {
            if (cal(x) % 2 == 0) {
                ret++;
            }
        }
        return ret;
    }
};

第二题:

先统计每个数分别有多少个,然后每一轮,从最小的数开始,取连续k个,如果中间的某个数的个数为0,直接返回false,这样直接把所有的数全取完,返回true

class Solution {
public:
    bool isPossibleDivide(vector<int>& nums, int k) {
        map<int, int> count;
        for (auto& x: nums) {
            count[x]++;
        }
        while (count.size() > 0) {
            int x = count.begin()->first;
            for (int i = 0;i < k;i++) {
                if (count.find(x) == count.end()) {
                    return false;
                }
                count[x]--;
                if (count[x] == 0) {
                    count.erase(count.find(x));
                }
                x++;
            }
        }
        return true;
    }
};

第三题:

注意条件,1 <= minSize <= maxSize <= min(26, s.length)
假设s两个子串,p和t,并且p是t的子串,len(p) < len(t)
那么

  1. 如果p满足“子串中不同字母的数目必须小于等于maxLetters”,那么t不一定满足
  2. 如果p不满足“子串中不同字母的数目必须小于等于maxLetters”,那么t一定不满足
  3. p在s出现的次数,肯定不小于t在s出现的次数

因此,我们只需要判断s中所有长度为minSize的子串是否满足“子串中不同字母的数目必须小于等于maxLetters”,再统计最大的次数即可

还有一个条件。。。minSize <= min(26, s.length),也就是minSize最大才26。比赛中看成minSize <= max(26, s.length),导致整了1个小时才打出来,大掉分,悲剧啊。。。。

class Solution {
public:
    int maxFreq(string s, int maxLetters, int minSize, int maxSize) {
        map<string, int> count;
        for (int i = 0;i + minSize - 1 < s.size();i++) {
            string p = s.substr(i, minSize);
            vector<bool> bit(26, false);
            for (auto& c: p) {
                bit[c - 'a'] = true;
            }
            int l = 0;
            for (int i = 0;i < 26;i++) {
                if (bit[i]) {
                    l++;
                }
            }
            if (l <= maxLetters) {
                count[p]++;
            }
        }
        int ret = 0;
        for (auto& it: count) {
            ret = max(ret, it.second);
        }
        return ret;
    }
};

第四题:

模拟题,每一轮寻找没被访问过的,可见的,并且开着的,或者关着有钥匙的箱子,访问,吃糖果,把里面的箱子拿出来,把钥匙拿出来。。。直到没有箱子可以被访问

class Solution {
public:
    int maxCandies(vector<int>& status, vector<int>& candies, vector<vector<int>>& keys, vector<vector<int>>& containedBoxes, vector<int>& initialBoxes) {
        int n = status.size();
        vector<bool> visited(n, false);
        vector<bool> watch(n, false);
        vector<bool> hasKey(n, false);
        
        for (auto& x: initialBoxes) {
            watch[x] = true;
        }
        int ret = 0;
        while (1) {
            int find = -1;
            for (int i = 0;i < n;i++) {
                if (!watch[i] || visited[i]) {
                    continue;
                }
                if (status[i] == 0 && !hasKey[i]) {
                    continue;
                }
                find = i;
                break;
            }
            if (find == -1) {
                break;
            }
            visited[find] = true;
            ret += candies[find];
            for (auto& x: keys[find]) {
                hasKey[x] = true;
            }
            for (auto& x: containedBoxes[find]) {
                watch[x] = true;
            }
        }
        return ret;
    }
};
6
展开全部 16 讨论