腾讯音乐笔试 源码 0926
第一题(AC):
一次可以变2个,将字符串变为全0或全1
思路:暴力
class Solution {
public:
int minOperations(string str) {
int len = str.length();
// all to 0
int ans0 = 0;
for (int i = 0; i < len; ++i) {
if (str[i] == '1') {
++ans0;
++i;
}
}
int ans1 = 0;
for (int i = 0; i < len; ++i) {
if (str[i] == '0') {
++ans1;
++i;
}
}
return min(ans0, ans1);
}
};
第二题(AC): 给一个数组,找一段区间,其区间内的积的后缀有不少于x个0;给定x之后求有多少种这样的区间。
思路:
统计每个数内2和5的个数,然后前缀和。
class Solution {
public:
int getSubarrayNum(vector<int>& a, int x) {
const int mod = 1e9 + 7;
int size = a.size();
vector<int> n2(size, 0);
vector<int> n5(size, 0);
for (int i = 0; i < size; ++i) {
if (i) {
n2[i] = n2[i - 1];
n5[i] = n5[i - 1];
}
int num = a[i];
while (num % 2 == 0) {
++n2[i];
num /= 2;
}
while (num % 5 == 0) {
++n5[i];
num /= 5;
}
}
long long ans = 0;
for (int i = 0; i < size; ++i) {
int num = (i ? n2[i - 1] : 0) + x;
int dis2 = 0, dis5 = 0;
auto p = lower_bound(n2.begin(), n2.end(), num);
dis2 = distance(p, n2.end());
num = (i ? n5[i - 1] : 0) + x;
p = lower_bound(n5.begin(), n5.end(), num);
dis5 = distance(p, n5.end());
ans = (ans + min(dis2, dis5)) % mod;
}
return ans;
}
};
求好矩阵。
思路:每增加一行/一列,种类就*2.
所以总的种类有
其中8是2*2矩阵能带来的种类数。
然后x为偶数,也就是说每一个格子有x/2种选择,所以一共有
种可能。
然后对结果取模就可以。
注意
%mod要根据费马小定理求
不知道为什么只过了15%
class Solution {
public:
const long long mod = 1e9 + 7;
int numsOfGoodMatrix(int n, int m, int x) {
// write code here
long long y = (long long)m + (long long)n;
y %= mod;
long long num1 = quickM(x, y);
long long num2 = quickM(2, mod - 2);
return (int)((num1 * num2) % mod);
}
long long quickM(int b, long long y) {
long long base = b % mod;
long long ans = 1;
while (y) {
if (y & 1) ans = (ans * base) % mod;
base = (base * base) % mod;
y >>= 1;
}
return ans;
}
}; 