在编程学习的道路上,解决实际问题不仅能提升我们的算法能力,还能培养我们的逻辑思维。今天,我选择了解决豆包MarsCode AI刷题题库中的一道有趣题目:最少删除步骤将数组中的所有数字变为零。通过这篇文章,我将分享我的解题思路、知识总结以及高效的学习方法,希望能为正在学习的你提供一些帮助。
题目解析
问题描述
小R手中有一个长度为 n
的数组,每个元素都是一个正整数。小R可以每次删除数组中某个数的一位数字,逐步将所有数字变为零。目标是求出将数组中所有数字都变为零所需的最少步骤数。
示例:
- 输入:
n = 5, a = [10, 13, 22, 100, 30]
- 输出:
7
解题思路
这道题的关键在于每个数字变为零所需的步骤数。观察题目,我们发现每次操作可以删除一个数字的一位,因此,将一个数字变为零的最少步骤数等于该数字的非零位数。
具体步骤如下:
- 遍历数组中的每个数字:对于数组中的每一个数字,将其转换为字符串形式,以便逐位检查。
- 统计非零位数:对于每一个数字,统计其中非零位的数量,因为每个非零位都需要被删除一次。
- 累计总步骤数:将所有数字的非零位数累加起来,得到最终的最少步骤数。
例如,数字 103
有两位非零数字(1
和 3
),因此将其变为零需要两步。
代码详解
以下是实现上述思路的Python代码:
def solution(n: int, a: list) -> int:
total_steps = 0
for number in a:
# 将数字转换为字符串,遍历每一位,统计非零位的数量
total_steps += sum(1 for digit in str(number) if digit != '0')
return total_steps
if __name__ == '__main__':
# 测试样例
print(solution(5, [10, 13, 22, 100, 30]) == 7) # 输出: True
print(solution(3, [5, 50, 505]) == 4) # 输出: True
print(solution(4, [1000, 1, 10, 100]) == 4) # 输出: True
代码解释:
- 遍历每个数字:通过循环遍历数组中的每个数字,将其转换为字符串形式,以便逐位检查。
- 统计非零位:使用生成器表达式
sum(1 for digit in str(number) if digit != '0')
统计每个数字中的非零位数。 - 累计总步骤:将每个数字的非零位数累加到
total_steps
中,最终返回总步骤数。
知识总结
在解决这道题目的过程中,我总结了以下几个关键知识点:
- 字符串处理:将数字转换为字符串,以便逐位检查和处理。
- 生成器表达式:使用生成器表达式高效地统计满足特定条件的元素数量。
- 贪心策略:每一步选择删除一个非零位,确保每个删除操作都最大化地减少后续步骤。
这些知识点不仅适用于当前题目,还在其他编程问题中具有广泛的应用。
举一反三
基于这道题目的思路,我们可以延伸出更多类似的问题。以下是两个简单的小例子:
示例1:最少删除步骤将数组中的所有数字变为偶数
问题描述: 给定一个长度为 n
的数组,每个元素都是一个正整数。你可以每次删除某个数字的一位数字,使得最终数组中所有数字都是偶数。求最少需要多少步。
示例:
- 输入:
n = 3, a = [13, 24, 7]
- 输出:
3
解释:
- 对于数字
13
,删除1
变为3
(奇数),需要再删除3
变为0
(偶数),共2步。 - 对于数字
24
,已经是偶数,不需要删除。 - 对于数字
7
,删除7
变为0
(偶数),共1步。 - 总共需要
2 + 0 + 1 = 3
步。
示例2:最少删除步骤将数组中的所有数字变为质数
问题描述: 给定一个长度为 n
的数组,每个元素都是一个正整数。你可以每次删除某个数字的一位数字,使得最终数组中所有数字都是质数。求最少需要多少步。
示例:
- 输入:
n = 2, a = [15, 23]
- 输出:
2
解释:
- 对于数字
15
,删除1
变为5
(质数),共1步。 - 对于数字
23
,已经是质数,不需要删除。 - 总共需要
1 + 0 = 1
步。
注意: 如果某个数字无法通过删除操作变为质数,则需要将其删除到 0
,这也被视为一种有效操作。
通过这些简单的例子,我们可以进一步理解如何应用删除操作来满足不同的条件,同时也能提升我们的算法设计能力。
学习计划
为了高效地掌握类似的编程题目,我制定了以下学习计划:
- 每日刷题:每天至少解决一道来自豆包MarsCode AI刷题题库的题目,涵盖不同类型的算法问题。
- 总结与复习:每周回顾一周内做过的题目,整理解题思路和代码,实现知识的巩固。
- 错题本:将做错的题目记录在错题本中,分析错误原因,并定期复习,避免重复犯错。
- 时间管理:合理分配每天的学习时间,确保既有刷题时间,又有总结和复习时间。
通过系统的学习计划,可以有效提升自己的编程能力和解题技巧。
工具运用
在学习过程中,合理利用工具和资源能事半功倍。以下是我结合豆包MarsCode AI刷题功能的工具运用方法:
- 利用AI辅助:在刷题过程中,使用AI功能获取即时的提示和解答,帮助理解复杂的题目和算法。
- 结合在线教程:对于难以理解的题目,参考在线的算法教程和视频讲解,深入理解背后的原理。
- 使用版本控制:将自己的代码保存在GitHub等版本控制平台上,方便随时查看和回溯代码历史。
- 参与讨论社区:加入豆包MarsCode的学习社区,与其他学习者交流心得和解题技巧,互相帮助,共同进步。
通过多种工具和资源的结合使用,可以极大地提升学习效率和效果。
总结
解决“最少删除步骤将数组中的所有数字变为零”这道题目,不仅让我巩固了字符串处理和生成器表达式的使用,还让我深刻理解了贪心策略在算法中的应用。结合豆包MarsCode AI刷题平台的功能,我制定了高效的学习计划,并学会了如何利用各种工具提升学习效果。
希望这篇文章能为正在学习编程的你提供一些有价值的参考和启发。继续努力,相信你也能在编程的道路上取得优异的成绩!