腾讯音乐20220926
腾讯音乐20220926
第一题 01数列 AC
和之前百度的题目很像
给定一个01字符串s,你可以把相邻的两个字符变成“00”或“11”
求最少需要多少次变化可以使所有字符相等
s.length < 1000
solution
数据范围小,暴力求解
class Solution:
def minOperations(self, s: str) -> int:
def f(s, ch):
cnt = 0
for i in range(len(s) - 1):
if s[i] != ch:
cnt += 1
s[i + 1] = ch
s[i] = ch
return cnt if s[-1] == ch else cnt + 1
return min(f(list(s), "0"), f(list(s), "1"))
print(Solution().minOperations("1001101")) 第二题 子数组 AC
给定一个正整数数组a,以及一个正整数x
要求满足 子数组乘积尾随0个数大于等于x 的子数组个数
结果可能很大,对1e9+7取模
a.length ≤ 100000
0 < x < a.length
solution
首先你要知道尾随0的个数只和 2和5有关
其实就是一个动态规划
class Solution:
def getSubarrayNum(self, a: List[int], k: int) -> int:
# 定义dp[i] 为以i结尾的满足题意的子数组数量
# [5,2,3,50,4],2
mod = 10 ** 9 + 7
def get(x, base):
res = 0
while x % base == 0:
res += 1
x //= base
return res
n = len(a)
dp = [0] * (n + 1)
pre = [(0, 0)]
left = 0
for x in a:
t1, t2 = pre[-1]
pre.append((get(x, 2) + t1, get(x, 5) + t2))
for i in range(1, n + 1):
dp[i] += dp[i - 1]
while min(pre[i][1] - pre[left][1], pre[i][0] - pre[left][0]) >= k:
dp[i] += 1
left += 1
# print(dp)
return sum(dp) % mod
print(Solution().getSubarrayNum([5, 2, 3, 50, 4], 2)) 第三题 矩阵 15%
给定一个n x m 的二维矩阵,给定一个x,保证x为偶数
求矩阵中所有的数都在[1,x]之间且所有2 x 2子矩阵的和为偶数的矩阵构造方式
结果可能很大,对1e9+7取模
2 ≤ n, m, x ≤ 1e9
样例 n=m=x=2
有8种方法
全为1,1种放法
全为2,1种放法
两个1两个2,从4个位置选2个位置放1,有6种放法,剩余放2
1 + 1 + 6
solution
这个数据范围属实吓人
我推了很久还是不知道怎么做,等大佬吧
还有一个构造题,秒杀系统,不懂这方面直接跳过了
总结
寄
#腾讯音乐##笔试##23届秋招笔面经##腾讯音乐23秋招笔试好难啊,麻了#