问题描述
数字魔法师小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
问题理解
题目虽然是中等题,但是比较简单。我们需要对一个数字字符串进行多次“进位”操作。每次操作的规则是对字符串中的每个数字加一,如果某位数字为9,则加一后变成0,并在前面补1。最终结果需要对 1000000007 取模。
数据结构选择
由于我们需要频繁地对字符串进行修改,并且字符串的长度可能会在每次操作后增加,因此选择字符串作为主要的数据结构是合适的。
算法步骤
- 初始化:从给定的数字字符串开始。
- 模拟操作:
- 对字符串中的每个数字进行加一操作。
- 如果某位数字为9,则加一后变成0,并在前面补1。
- 这一步可以通过从后向前遍历字符串来实现,使用一个
carry变量来处理进位。
- 重复操作:重复上述操作
k次。 - 取模操作:由于结果可能非常大,最终结果需要对
1000000007取模。
def solution(n: int, k: int, num_str: str) -> int:
# Please write your code here
a = 1000000007
for _ in range(k):
new_number = ""
for i in num_str:
if int(i) == 9:
i = "10"
new_number += i
else:
i = str(int(i)+1)
new_number += i
num_str = new_number
return int(num_str) % a
if __name__ == "__main__":
# You can add more test cases here
print(solution(3, 1, "798") == 8109)
print(solution(3, 3, "798") == 103221)
总结
在这个问题中,我们需要对一个数字字符串进行多次“进位”操作,每次操作的规则是对字符串中的每个数字加一,如果某位数字为9,则加一后变成0,并在前面补1。最终结果需要对 1000000007 取模。我们选择字符串作为主要的数据结构,通过从后向前遍历字符串并使用 carry 变量来处理进位,模拟每次操作。重复这个过程 k 次后,将最终结果转换为整数并对 1000000007 取模。这个方法的时间复杂度为 O(k * n),空间复杂度为 O(n),能够有效地解决这个问题。