1. 解题思路
这一题是Leetcode周赛477的第三题,是一道medium的题目,也是题目3754. Concatenate Non-Zero Digits and Multiply by Sum I的进阶版。
这一题的话,我们只需要求出每一个位置上对应的后续有效数字对于 1 0 9 + 7 10^9+7 109+7的模,这样,我们要求出对以一个区间的数字,只需要将对其左右区间范围的两个数相减,然后除以 1 0 m 10^m 10m即可,其中 m m m为右边界对应的 10 10 10的阶数。
2. 代码实现
给出python代码实现如下:
MOD = 10**9+7
class Solution:
def sumAndMultiply(self, s: str, queries: List[List[int]]) -> List[int]:
n = len(s)
remains = [0 for _ in range(n+1)]
powers = [1 for _ in range(n+1)]
tot = [0 for _ in range(n+1)]
flag = 1
for i in range(n-1, -1, -1):
digit = int(s[i])
tot[i] = tot[i+1] + digit
if digit == 0:
remains[i] = remains[i+1]
powers[i] = powers[i+1]
else:
remains[i] = (remains[i+1] + digit * flag) % MOD
flag = (flag * 10) % MOD
powers[i] = (powers[i+1] * pow(10, -1, MOD)) % MOD
def query(i, j):
return (remains[i] - remains[j+1]) * powers[j+1] * (tot[i] - tot[j+1]) % MOD
return [query(i,j) for i, j in queries]
提交代码评测得到:耗时767ms,占用内存52.30MB。

被折叠的 条评论
为什么被折叠?



