【2022/05/01-第291场单周赛】复盘

总结

这次换到了美服做,然后起晚了+英文渣看错题,当了一波韭菜,血亏!

Q1.移除指定数字得到的最大结果

从前往后若某个给定数后面的数大于它就移除他,若没有则移除最后一个给定数。

class Solution {
public:
    string removeDigit(string s, char digit) {
        for(int i = 0; i < s.size() - 1; ++i){
            if(s[i] == digit && s[i + 1] > s[i]){
                s.erase(s.begin() + i);
                return s;
            }
        }
        for(int i = s.size() - 1; i >= 0; --i){
            if(s[i] == digit){
                s.erase(s.begin() + i);
                return s;
            }
        }
        return s;
    }
};

更暴力的办法,一个一个移除。

class Solution {
public:
    string removeDigit(string s, char digit) {
        string ret;
        for(int i = 0; i < s.size(); ++i){
            if(s[i] == digit){
                if(s.substr(0, i) + s.substr(i + 1, s.size() - i - 1) > ret){
                    ret = s.substr(0, i) + s.substr(i + 1, s.size() - i - 1);
                }
            }
        }
        return ret;
    }
};

Q2.必须拿起的最小连续卡牌数

用哈希表把每个数的所有坐标都存下来然后找最小距离。

class Solution {
public:
    int minimumCardPickup(vector<int>& cards) {
        int ret = INT_MAX;
        unordered_map<int, vector<int>> mp;
        int n = cards.size();
        for(int i = 0; i < n; ++i){
            mp[cards[i]].push_back(i);
        }
        for(auto v : mp){
            if(v.second.size() == 1) continue;
            for(int i = 0; i < v.second.size() - 1; ++i){
                ret = min(ret, v.second[i + 1] - v.second[i] + 1);
            }
        }
        if(ret == INT_MAX) return -1;
        return ret;
    }
};

只存每个数上一个坐标

class Solution {
public:
    int minimumCardPickup(vector<int>& cards) {
        int ret = INT_MAX;
        unordered_map<int, int> mp;
        int n = cards.size();
        for(int i = 0; i < cards.size(); ++i){
            if(mp.find(cards[i]) == mp.end()) mp[cards[i]] = i;
            else {
                ret = min(ret, i - mp[cards[i]] + 1);
                mp[cards[i]] = i;
            }
        }
        if(ret == INT_MAX) return -1;
        return ret;
    }
};

Q3.含最多 K 个可整除元素的子数组

比赛的时候没看到子数组是连续元素组成的,直接麻了。
用数组转字符串的哈希表来存储不同满足条件的子数组。

class Solution {
public:
    int countDistinct(vector<int>& nums, int k, int p) {
        unordered_set<string> st;
        int n = nums.size();
        for(int i = 0; i < n; ++i){
            string temp;
            int cnt = 0;
            for(int j = i; j < n; ++j){
                if(nums[j] % p == 0) ++cnt;
                if(cnt > k) break;
                temp += "#";
                temp += to_string(nums[j]);
                st.insert(temp);
            }
        }
        return st.size();
    }
};

还可以用字典树去重,之后再学学。

Q4.字符串的总引力

记录下每个字母所有下标。
对于从i开始的所有子字符串,每个字母第一次出现之后的每个字符串吸引力都会+1。

class Solution {
public:
    long long appealSum(string s) {
        vector<int> h[26];
        long long n = s.size(), ret = 0;
        for(int i = 0; i < n; ++i) h[s[i] - 'a'].push_back(i);
        for(int i = 0; i < 26; ++i) reverse(h[i].begin(), h[i].end()); // 防止去掉元素超时
        for(int i = 0; i < n; ++i){
            for(int j = 0; j < 26; ++j){
                if(!h[j].empty() && h[j].back() < i) h[j].pop_back();
                if(!h[j].empty()) ret += n - h[j].back();
            }
        }
        return ret;
    }
};
posted on 2022-05-03 22:16  damnglamour  阅读(21)  评论(0)    收藏  举报