问题描述
数字魔法师小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 取模后的值
解题思路
我们需要对给定数字字符串按照特定的 “进位” 规则进行多次操作,并最终将结果对 1000000007 取模返回。其核心思路是通过循环 k 次,每次遍历数字字符串中的每个数字,根据规则进行变换,得到新的数字字符串,最后对处理后的结果取模。
定义函数与取模常量:用于后续对最终结果进行取模操作,以避免可能出现的整数溢出问题,确保结果在合理的数值范围内。
循环执行数字变换操作
-
外层的
for _ in range(k)循环:控制整个数字变换操作的次数,会按照给定的k值重复执行内部的数字变换逻辑。 -
每次循环内部的操作如下:
-
首先创建一个空字符串
new_number,用于存储本次循环中根据规则变换数字字符串num_str后得到的新数字字符串。 -
然后通过内层的
for i in num_str循环遍历当前的数字字符串num_str中的每一个字符i。对于每个字符i,执行以下操作:- 当
int(i) == 9时:按照规则,数字9加一后应该变为0并向前一位进位1。这里代码将i赋值为"10"(这种处理方式是一种简单的模拟进位的做法,但存在一些潜在问题,后面会提到),然后将"10"添加到new_number中。 - 当
int(i)!= 9时:将字符i转换为整数后加1,再转换回字符串形式,即i = str(int(i)+1),然后将得到的新字符串添加到new_number中。
- 当
-
最后,将本次循环得到的新数字字符串
new_number赋值给num_str,以便在下一次循环中继续对其进行变换操作。
-
取模操作:在完成了 k 次数字变换操作后,将最终得到的数字字符串 num_str 转换为整数,然后对之前定义的取模常量 MOD 取模,得到的结果就是经过 k 次操作后最终结果对 1000000007 取模的值,也就是函数要返回的答案。
代码展示
def solution(n: int, k: int, num_str: str) -> int:
# Please write your code here
MOD = 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) % MOD
测试样例
样例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刷题报错
可能的错误原因
- 进位处理错误:
- 当某位数字为9时,你将其替换为 "10",这会导致字符串长度增加,但进位处理不正确。
- 例如,对于 "798",处理后变为 "7108",而不是 "8109"。
- 字符串拼接问题:
- 每次操作后,字符串拼接可能会导致结果不正确。
- 例如,对于 "798",处理后变为 "7108",而不是 "8109"。
- 于是我一直让他自查自改,最终还是没有解决问题,
AI刷题实践感悟
我觉得刷题对我这种小白而言是为了更好的看懂代码,理解代码,学习,最终能够自己独立写代码,刚开始的时候只有一点点python语法基础,对很多东西都不懂,一入苦学深似海,无论是每日刷题还是AI练中学,都感觉有一条鸿沟深不见底,学不懂很是内耗,marscode在很大程度上帮助了我从生硬的理论知识记忆逐渐帮我摆脱舒适区,反复的读代码与尝试写代码,ai老师改错修正,能够让我对基本的思维能力有了很大的提升,能够一眼知道哪些题会哪些题不会,虽然我还分不清那些属于神那么,但是在面对不同类型的题目时,基本迅速分析问题的本质,尝试多种解题思路,并在不同思路之间进行比较和权衡。这种多维度的思考方式是难能可贵的,而这正是 AI 研发中不可或缺的素质。在处理一些综合性较强的算法题时,我是压根儿不会,但AI刷题似乎也不太会,有些时候很是智障,他自己写的代码也没对,让他改也改不对,分析原因也大差不多就是做不对,不过也比我强多了哈哈哈哈。
刷题实践不仅仅是为了应对一道道孤立的题目,更是为了将所学知识应用到实际的 AI 项目中。在完成了大量的刷题训练后,我深刻体会到算法和数据结构在 AI 中的核心地位。例如,在构建一个图像识别模型时,数据的存储和处理需要合理运用数组、矩阵等数据结构,而模型的训练过程则涉及到梯度下降等优化算法的应用。通过刷题所积累的算法优化经验,我能够更好地调整模型的参数,提高模型的训练效率和准确性。
同时,刷题过程中培养的问题解决能力和编程技巧也为我在 AI 项目开发中提供了坚实的保障。在面对实际项目中的各种技术难题时,我能够迅速运用所学知识进行分析和解决,并且能够高效地编写代码实现解决方案。例如,在开发一个自然语言处理应用时,需要处理大量的文本数据,这就要求我熟练运用字符串处理算法和数据结构来进行文本清洗、分词、特征提取等操作,而这些技能都是在刷题实践中不断磨砺而成的。
然而,刷题实践也让我认识到,单纯的编程能力并不能满足 AI 应用开发的需求。AI 是一个跨学科的领域,除了技术层面的知识外,还需要对数学、统计学、领域知识等有深入的理解。在实际项目中,我常常需要运用数学知识来推导模型的公式、进行数据分析和评估,同时还需要了解具体应用领域的业务逻辑和需求,以便更好地设计和优化 AI 系统。因此,在今后的学习和实践中,我将更加注重多学科知识的融合与应用,努力提升自己的综合素质,以更好地应对 AI 应用开发中的各种挑战。