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

167 阅读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 问题分析 这道题的核心在于模拟每次操作的变化规则,并处理由进位导致的字符串长度变化。我们需要重点关注以下几方面:

问题分析

这道题的核心在于模拟每次操作的变化规则,并处理由进位导致的字符串长度变化。我们需要重点关注以下几方面:

  • 逐位处理加一操作: 直接通过遍历字符串的每个字符,逐步计算加一后的结果。

  • 大数取模:最终结果可能非常大,需对1000000007取模。

解题思路

我们可以通过模拟操作步骤逐次更新数字字符串,并在完成所有k次操作后,将结果转化为整数并取模。实现步骤如下:

def solution(n: int, k: int, num_str: str) -> int:
    # 定义加一操作的函数
    f = lambda x: str(int(x) + 1)
    t = num_str  # 初始化操作字符串
    for _ in range(k):  # 循环执行k次操作
        t = "".join(map(f, t))  # 对每个字符执行加一操作,合并结果
    return int(t) % 1000000007  # 转换为整数并取模

if __name__ == "__main__":
    # 测试样例
    print(solution(3, 1, "798"))  # 输出:8109
    print(solution(3, 3, "798"))  # 输出:103221
    print(solution(4, 3, "7989"))  # 输出:10322132

代码解析

  • 函数定义:使用 lambda 定义了一个简洁的加一函数 f,用于处理单个字符的加一逻辑。
  • 模拟操作:每次操作对字符串的每一位进行加一,利用 map(f, t) 将操作应用于整个字符串。
  • 累积结果:k次循环后得到最终的操作结果,转化为整数并取模。

优化思路

  • 使用整型数组代替字符串操作:对于操作次数较大的情况,可考虑将字符串转化为数字数组以优化加法效率。
  • 实时模运算:在每次循环中对结果动态取模。