题解-数字魔法的加一操作 | 豆包MarsCode AI刷题

227 阅读3分钟

数字魔法的加一操作题解

问题描述

数字魔法师小U发现了一种特殊的加一变换操作。给定一个数字字符串 num_str,其中每个字符代表一个数字,每次操作会让每位数字都加一。如果某位数字是9,加一后会变成0。这个操作会重复k次,因此每次操作后的字符串会逐渐变化。我们的任务是对这个字符串执行k次操作后,将最终结果对 1000000007 取模。

输入与输出

  • 输入包括一个数字字符串 num_str,其长度为 n,以及操作次数 k
  • 要求返回经过k次操作后的字符串结果,并对结果取模 1000000007 的整数值。

示例

  1. 示例1:输入 n = 3, k = 1, num_str = "798"

    • 经过一次加一操作,字符串变成 "8109"
  2. 示例2:输入 n = 3, k = 3, num_str = "798"

    • 第一次操作:"798" -> "8109"
    • 第二次操作:"8109" -> "92110"
    • 第三次操作:"92110" -> "103221"
    • 最终结果为 103221

解题思路

在这道题目中,每次加一操作都应用于 num_str 中的每一位,且无需特别处理进位。代码可以利用Python的字符串拼接和列表解析轻松实现。具体步骤如下:

  1. 逐位加一
    将字符串中的每个字符转为整数,然后对每个数字加一。
  2. k次操作的迭代
    外层循环执行k次操作,每次操作后都将新生成的字符串更新为 num_str,为下一轮操作做准备。
  3. 结果取模
    最终输出之前,将字符串转为整数,并对 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 

代码解析

  1. 字符串转化和逐位加一
    num = [str(i+1) for i in list(map(int,list(num_str)))] 这一行代码将每一位字符转换成整数后加一。
  2. 更新字符串
    通过 "".join(num) 将每次操作得到的 num 列表拼接成字符串,更新 num_str
  3. 结果取模
    最终返回的结果在取整后对 1000000007 取模,保证输出的整数值不会过大。

时间复杂度与空间复杂度分析

  • 时间复杂度:代码的时间复杂度为 O(k×n),因为每次操作都需要遍历字符串的每一位。
  • 空间复杂度:由于字符串拼接和重新赋值,空间复杂度也是O(n)

个人思考与总结

此题的难点在于对“加一”操作的理解,尤其是如何在无需额外进位的情况下简化代码实现。直接使用列表推导,使得代码更加简洁。这种题目训练了我们对字符串处理和数字运算的理解,也强化了对Python字符串操作与列表解析的运用。