3463:判断操作后字符串中的数字是否相等 II(2286 分)
目录
题目
给你一个由数字组成的字符串 s
。重复执行以下操作,直到字符串恰好包含 两个 数字:
- 从第一个数字开始,对于
s
中的每一对连续数字,计算这两个数字的和 模 10。 - 用计算得到的新数字依次替换
s
的每一个字符,并保持原本的顺序。
如果 s
最后剩下的两个数字相同,则返回 true
。否则,返回 false
。
示例 1:
输入: s = "3902"
输出: true
解释:
- 一开始,
s = "3902"
- 第一次操作:
(s[0] + s[1]) % 10 = (3 + 9) % 10 = 2
(s[1] + s[2]) % 10 = (9 + 0) % 10 = 9
(s[2] + s[3]) % 10 = (0 + 2) % 10 = 2
s
变为"292"
- 第二次操作:
(s[0] + s[1]) % 10 = (2 + 9) % 10 = 1
(s[1] + s[2]) % 10 = (9 + 2) % 10 = 1
s
变为"11"
- 由于
"11"
中的数字相同,输出为true
。
示例 2:
输入: s = "34789"
输出: false
解释:
- 一开始,
s = "34789"
。 - 第一次操作后,
s = "7157"
。 - 第二次操作后,
s = "862"
。 - 第三次操作后,
s = "48"
。 - 由于
'4' != '8'
,输出为false
。
提示:
3 <= s.length <= 105
s
仅由数字组成。
相似问题:
分析
#1
- 先令 t = s[:-1],求出 t 每个数字的贡献次数
- 令 f[i][j] 代表 t 长为 i 时第 j 个数字的贡献次数
- 则 f[i][j] = f[i-][j-1]+f[i-1][j]
- 这即是杨辉三角的递推式,f[i][j] 即是 comb(i-1,j)
- 遍历 t 每个数字及贡献次数,即可求出总和模10
- 同理求出 t2 = s[1:] 的总和模10,比较即可
- 问题转为快速求 comb(m,n)%10 的值
- 由于 m 会大于 10,不能直接求逆元,可以用 lucas 定理
|
|
3968 ms
#2
- 由于 10 只有两个因子,另一种方法是提取出分子分母所有 2 和 5 的因子个数,剩下的因子可以求逆元
解答
|
|
548 ms