【2022-07-24-第303场单周赛】

总结

第三题段错误不应该,第四题属于是想岔了。

Q1.第一个出现两次的字母

暴力哈希。

class Solution {
public:
    char repeatedCharacter(string s) {
        int h[128]; memset(h, 0, sizeof(h));
        for(auto i : s){
            if(h[i] == 0) h[i]++;
            else return i;
        }
        return 'a';
    }
};

Q2.相等行列对

暴力哈希。

class Solution {
public:
    int equalPairs(vector<vector<int>>& g) {
        int n = g.size(), ret = 0;
        map<vector<int>, int> mp;
        for(int i = 0; i < n; ++i) mp[g[i]]++;
        for(int i = 0; i < n; ++i){
            vector<int> temp;
            for(int j = 0; j < n; ++j) temp.push_back(g[j][i]);
            if(mp.find(temp) != mp.end()) ret += mp[temp];
        }
        return ret;
    }
};

Q3.设计食物评分系统

确认过眼神,是哈希场。

class FoodRatings {
public:
    
    priority_queue<pair<int, string>, vector<pair<int, string>>, greater<>> q[20010];
    map<string, int> mp1;
    map<string, string> mp2;
    map<string, int> mpidx;
    FoodRatings(vector<string>& f, vector<string>& c, vector<int>& r) {
        int idx = 0;
        int n = f.size();
        for(int i = 0; i < n; ++i){
            if(mpidx.find(c[i]) == mpidx.end()){
                mpidx[c[i]] = idx++;
            }
            q[mpidx[c[i]]].push({-r[i], f[i]});
            mp1[f[i]] = r[i];
            mp2[f[i]] = c[i];
        }
    }
    
    void changeRating(string f, int nr) {
        q[mpidx[mp2[f]]].push({-nr, f});
        mp1[f] = nr;
    }
    
    string highestRated(string c) {
        auto k = q[mpidx[c]].top();
        while(k.first != -mp1[k.second]){
            q[mpidx[c]].pop();
            k = q[mpidx[c]].top();
        }
        return k.second;
    }
};

Q4.优质数对的数目
二进制位为1的数目和大于等于k的数对数量。

class Solution {
public:
    
    int getk(int x){
        int ret = 0;
        while(x){
            ret += x & 1;
            x >>= 1;
        }
        return ret;
    }
    
    long long countExcellentPairs(vector<int>& a, int k) {
        long long ret = 0;
        unordered_set<int> st[32];
        for(auto i : a){
            st[getk(i)].insert(i);
        }
        int n = 0;
        for(int i = 0; i < 32; ++i) n += st[i].size();
        for(int i = 0; i < 32; ++i){
            for(auto u : st[i]){
                for(int j = max(0, k - i); j < 32; ++j){
                    ret += st[j].size();
                }
            }
        }
        return ret;
    }
};
posted on 2022-08-02 15:13  damnglamour  阅读(24)  评论(0)    收藏  举报