8.27 字节跳动笔试

第一题

因为只能修改一次,所以从头遍历找到第一个不同的位置,然后修改s,计算最长前缀和后缀,相乘得到答案。另外需要从后往前做一遍相同的操作。注意可能有完全匹配的情况出现,因此也需要考虑没有不同位置的情况。

第二题

二维前缀和的一点点修改,需要根据三个颜色建立三个二维度前缀和表,计算的时候所有查询子矩阵中个数不为零的颜色就是出现了的。

第三题

数学题,不是特别有思路,写了个暴力打表找到的规律,费了很多时间。

ans = (n // 2 * (n+1 // 2)) * 2025 * pow(10, n-2) % (1e9 + 7)

第四题

时间不够没做出来,看起来像是一个数位DP,有没有做出来的大佬指点一下。

全部评论
第3题有如下规律: 从0到(10**k)-1(即所有k位数字)的和为:45*k*10**(k-1)。 对于位数n,分为奇数位a和偶数位b(n=a+b),分别用上面式子求一下在相乘即可 10**k用二分求解,基本题型了。
2 回复 分享
发布于 2023-08-27 12:39 江苏
第四题用小于r+1的减去小于l的,对于小于n的,通过计算最大为1到9的数字的数量去算权重,数字数量就用容斥原理和dp了
1 回复 分享
发布于 2023-08-27 12:19 北京
最后一题同来不及,感觉应该是下面这样。 先打表 dp[n][i] 表示从0到 10**n-1 的数里答案为i的数量。 然后对于数字num进行dfs 令a为num的首位,b为去掉首位的剩余值(例如num=201, a=2, b=1),l为数字长度, dfs中分两部分: def dfs(num): count = [0] * 10 count2 = dfs(b) for digit in range(10): for i in range(a): count[max(digit, i)] += dp[l-1][digit] count[max(digit, a)] += count2[digit] return count 最后把首尾区间相减算总和。
1 回复 分享
发布于 2023-08-27 12:33 江苏
第三题: 你考虑因式分解,就变成了奇数的所有权值和 * 偶数的所有权值和。 然后对于奇数的所有权值和你考虑每一位的贡献是(1+2...+9) * 10^{len - 1} * len 第四题: 可以通过[1...r] - [1..l-1]得到[l,r],然后对于[1...r],你枚举所有数的最大值x从1到9,这就变成了问你1到r里面所有数<=x有多少方案,最大值=x,就是<=x减去<=x-1,用数位dp计算就可以了。代码如下: https://pastebin.ubuntu.com/p/VTW4fkggKG/
1 回复 分享
发布于 2023-08-27 14:12 浙江
第四题有AC的吗?我记得题目中数字会到10**18那么大,这样的话O(n)的复杂度会超时吧。
1 回复 分享
发布于 2023-08-29 00:26 广东
第四题同有思路来不及写
点赞 回复 分享
发布于 2023-08-27 12:35 浙江
有思路运行不出来
点赞 回复 分享
发布于 2023-08-27 13:41 河南
四题90 25 25 25 😅
点赞 回复 分享
发布于 2023-08-27 14:05 浙江

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
评论
4
13
分享
牛客网
牛客企业服务