问题描述
数字魔法师小U发现了一种特殊的数字变换魔法。这个魔法可以对一个数字字符串进行"进位"操作。每次操作规则如下:
- 对字符串中的每个数字进行加一操作
- 当某位数字为9时,加一后变成 0,并在前面补 1
例如:
- "798" 经过一次操作变成 "8109"(7→8, 9→0并向前增加一个1, 8→9)
- "999" 经过一次操作变成 "101010"
现在给定一个数字字符串 num_str(长度为n)和操作次数 k,请计算经过 k 次操作后得到的最终结果。由于结果可能非常大,请将答案对 1000000007 (10^9 + 7) 取模。
输入
- 第一行包含两个整数 n 和 k(1 ≤ n ≤ 50, 1 ≤ k ≤ 100)
- 第二行包含一个长度为n的数字字符串 num_str,仅由数字0-9组成
返回
- 返回一个整数,表示最终结果对 1000000007 取模后的值
测试样例
样例1:
输入:
n = 3 ,k = 1 ,num_str = "798"
返回:8109
解释:798 经过一次操作变成 8109
样例2:
输入:
n = 3 ,k = 3 ,num_str = "798"
返回:103221
- 第一次操作:798 → 8109
- 第二次操作:8109 → 92110
- 第三次操作:92110 → 103221
样例3:
输入:
n = 4 ,k = 3 ,num_str = "7989"
返回:10322132
解题思路
我们可以运用AI提供一点解题思路,同时有思路的时候可以想AI提问运用怎样的数据结构能够更好地实现自己地想法。
由于我们需要频繁地在字符串的前面和后面进行插入和删除操作,使用 deque(双端队列)是一个不错的选择。deque 允许我们在两端高效地进行插入和删除操作。
算法步骤
-
初始化:将输入的数字字符串转换为
deque,方便后续操作。 -
进位操作:
- 遍历
deque中的每个数字。 - 对每个数字进行加一操作。
- 如果数字变为10,将其变为0,并在
deque的前面插入1。
- 遍历
-
重复操作:重复上述进位操作
k次。 -
结果生成:将
deque中的数字重新组合成一个整数,并对1000000007取模。
解题代码
根据AI解题助手提供的思路我们可以先将原字符串转换为双端队列,并且每一次逐个取出加一后再加入队列中,需要特别判断的是,当加一结果等于10的时候要先把1加入队列再加入0。
from collections import deque
MOD = 1000000007
def solution(n, k, numStr):
numString = deque(int(numStr[i]) for i in range(n))
for t in range(k):
l = len(numString)
for i in range(l):
num = numString.popleft()
num += 1
if num == 10:
numString.append(1)
numString.append(0)
else:
numString.append(num)
result = 0
l = len(numString)
for i in range(l):
result = (result * 10 + numString.popleft()) % MOD
return result