魔法数字的加一操作|青训营

101 阅读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

解题思路

我们可以运用AI提供一点解题思路,同时有思路的时候可以想AI提问运用怎样的数据结构能够更好地实现自己地想法。 由于我们需要频繁地在字符串的前面和后面进行插入和删除操作,使用 deque(双端队列)是一个不错的选择。deque 允许我们在两端高效地进行插入和删除操作。

算法步骤

  1. 初始化:将输入的数字字符串转换为 deque,方便后续操作。

  2. 进位操作

    • 遍历 deque 中的每个数字。
    • 对每个数字进行加一操作。
    • 如果数字变为10,将其变为0,并在 deque 的前面插入1。
  3. 重复操作:重复上述进位操作 k 次。

  4. 结果生成:将 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