数字魔法的加一操作题解
问题描述
数字魔法师小U发现了一种特殊的加一变换操作。给定一个数字字符串 num_str,其中每个字符代表一个数字,每次操作会让每位数字都加一。如果某位数字是9,加一后会变成0。这个操作会重复k次,因此每次操作后的字符串会逐渐变化。我们的任务是对这个字符串执行k次操作后,将最终结果对 1000000007 取模。
输入与输出
- 输入包括一个数字字符串
num_str,其长度为n,以及操作次数k。 - 要求返回经过k次操作后的字符串结果,并对结果取模
1000000007的整数值。
示例
-
示例1:输入
n = 3,k = 1,num_str = "798"- 经过一次加一操作,字符串变成
"8109"。
- 经过一次加一操作,字符串变成
-
示例2:输入
n = 3,k = 3,num_str = "798"- 第一次操作:
"798" -> "8109" - 第二次操作:
"8109" -> "92110" - 第三次操作:
"92110" -> "103221" - 最终结果为
103221。
- 第一次操作:
解题思路
在这道题目中,每次加一操作都应用于 num_str 中的每一位,且无需特别处理进位。代码可以利用Python的字符串拼接和列表解析轻松实现。具体步骤如下:
- 逐位加一
将字符串中的每个字符转为整数,然后对每个数字加一。 - k次操作的迭代
外层循环执行k次操作,每次操作后都将新生成的字符串更新为num_str,为下一轮操作做准备。 - 结果取模
最终输出之前,将字符串转为整数,并对1000000007取模,这一步是为了符合题目的输出要求,防止结果过大导致溢出。
代码实现
def solution(n, k, num_str):
while k > 0:
num = [str(i+1) for i in list(map(int,list(num_str)))]
num_str = "".join(num)
k-=1
return int(num_str)%1000000007
代码解析
- 字符串转化和逐位加一
num = [str(i+1) for i in list(map(int,list(num_str)))]这一行代码将每一位字符转换成整数后加一。 - 更新字符串
通过"".join(num)将每次操作得到的num列表拼接成字符串,更新num_str。 - 结果取模
最终返回的结果在取整后对1000000007取模,保证输出的整数值不会过大。
时间复杂度与空间复杂度分析
- 时间复杂度:代码的时间复杂度为
O(k×n),因为每次操作都需要遍历字符串的每一位。 - 空间复杂度:由于字符串拼接和重新赋值,空间复杂度也是
O(n)。
个人思考与总结
此题的难点在于对“加一”操作的理解,尤其是如何在无需额外进位的情况下简化代码实现。直接使用列表推导,使得代码更加简洁。这种题目训练了我们对字符串处理和数字运算的理解,也强化了对Python字符串操作与列表解析的运用。