问题描述
数字魔法师小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次循环后得到最终的操作结果,转化为整数并取模。
优化思路
- 使用整型数组代替字符串操作:对于操作次数较大的情况,可考虑将字符串转化为数字数组以优化加法效率。
- 实时模运算:在每次循环中对结果动态取模。