中等题:数字魔法的加一操作 | 豆包MarsCode AI刷题

133 阅读3分钟

问题描述

数字魔法师小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 取模。

数据结构选择

由于我们需要频繁地对字符串进行修改,并且字符串的长度可能会在每次操作后增加,因此选择字符串作为主要的数据结构是合适的。

算法步骤

  1. 初始化:从给定的数字字符串开始。
  2. 模拟操作
    • 对字符串中的每个数字进行加一操作。
    • 如果某位数字为9,则加一后变成0,并在前面补1。
    • 这一步可以通过从后向前遍历字符串来实现,使用一个 carry 变量来处理进位。
  3. 重复操作:重复上述操作 k 次。
  4. 取模操作:由于结果可能非常大,最终结果需要对 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),能够有效地解决这个问题。