【2022/04/02-第75场双周赛】复盘

总结

比较水。

Q1.转换数字的最少位翻转次数

直接把每位比较。

class Solution {
public:
    int minBitFlips(int start, int goal) {
        int ret = 0;
        while(start || goal){
            if(start % 2 != goal % 2) ++ret;
            start /= 2;
            goal /= 2;
        }
        return ret;
    }
};

Q2.数组的三角和

直接模拟。

class Solution {
public:
    int triangularSum(vector<int>& nums) {
        for(int j = nums.size() - 1; j >= 0; --j){
            for(int i = 0; i < j; ++i){
                nums[i] = (nums[i] + nums[i + 1]) % 10;
            }
        }
        return nums[0];
    }
};

Q3.选择建筑的方案数

遍历,每到一个0就加上该位左边1数量和右边1数量之积,没到一个1就加上该位左边0数量和右边0数量之积。

class Solution {
public:
    long long numberOfWays(string s) {
        long long ret = 0;
        int n = s.size(), r1 = 0, r0 = 0, l1 = 0, l0 = 0;
        for(auto i : s){
            if(i == '1') ++r1;
            else ++r0;
        }
        for(auto i : s){
            if(i == '0'){
                ret += (long long)l1 * r1;
                ++l0;
                --r0;
            }
            if(i == '1'){
                ret += (long long)l0 * r0;
                ++l1;
                --r1;
            }
        }
        return ret;
    }
};

Q4.构造字符串的总得分和

Z函数(扩展KMP)的应用。

class Solution {
public:
    long long sumScores(string s) {
        int n = s.length();
        long long res = n;
        vector<int> z(n);
        for (int i = 1, l = 0, r = 0; i < n; ++i) {
            z[i] = max(min(z[i - l], r - i + 1), 0);
            while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
                l = i;
                r = i + z[i];
                ++z[i];
            }
            res += z[i];
        }
        return res;
    }
};

posted on 2022-05-05 16:14  damnglamour  阅读(18)  评论(0)    收藏  举报