【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;
}
};
浙公网安备 33010602011771号