腾讯音乐笔试 源码 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;

    }
};

第三题(15%):

求好矩阵。

思路:每增加一行/一列,种类就*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;
    }
};



#腾讯##腾讯音乐##腾讯音乐娱乐笔试##腾讯音乐23秋招笔试好难啊,麻了#
全部评论
按照每个位置填入值的奇偶性进行计算,那么偶数有 x/2 奇数有 x/2种情况。 理论上只有确认每个位置的奇偶性即可判断 2*2是否为偶数。 只要确定了第一行和第一列的奇偶情况,其他所有位置的奇偶情况一定确定。 (为什么一定确定,因为对于2*2,只要确定了3个格子,为保证偶数,第四个格子的奇偶性是唯一的。) 所以是 a= pow(2, m+n-1)种情况。 然后每种情况一共有b = pow(x/2, m*n)种排列情况。 总情况为  a*b。
3 回复 分享
发布于 2022-09-27 11:32 重庆
第三题思路一样。为什么只过15%,至今没找出问题在哪
点赞 回复 分享
发布于 2022-09-26 21:18 江苏
第三题简直世另我
点赞 回复 分享
发布于 2022-09-26 22:36 北京
同学同花顺尝试一下吗,面试简单不造火箭,可保姆式全程跟进度,我帖子有内推
点赞 回复 分享
发布于 2022-09-27 09:31 浙江
感谢分享
点赞 回复 分享
发布于 2022-09-27 09:48 北京

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
11-07 13:31
怀化学院 Java
勇敢牛牛不怕难:又疯一个
点赞 评论 收藏
分享
2 13 评论
分享
牛客网
牛客企业服务