Leetcode 3756. Concatenate Non-Zero Digits and Multiply by Sum II

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。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值