Python 数组题实战:替换为数位和后取最小值(LeetCode 风格解题)
在日常刷题或技术面试中,经常会遇到处理数组以及数位操作的题目。今天我们来分享一道非常典型的练习题:将整数数组中每个元素替换为它的各位数字之和,并返回替换后数组中的最小值。
这题虽然不难,但它融合了几个常见的技能点,比如:列表推导、字符串操作、内置函数使用、最小值查找等。如果你正在学习 Python,或者准备算法面试,这道题是个不错的练手项目。
🧾 题目描述
给定一个整数数组 nums,请你:
- 将
nums中的每一个元素替换为它的各个数位之和; - 返回替换后数组中的最小值。
📌 示例说明
假设输入数组如下:
nums = [38, 12, 7]
我们逐个处理:
38的数位和是3 + 8 = 1112的数位和是1 + 2 = 37是个位数,数位和就是它本身
所以替换后的数组是:
[11, 3, 7]
返回的结果是最小值 3。
🔧 解题思路
我们可以按以下步骤来实现这个问题:
- 定义一个函数
digit_sum(x)用来求某个数的各位数之和; - 遍历数组
nums,将每个元素替换为digit_sum(num); - 对新的数组应用
min()函数,找出最小值并返回。
✅ Python 实现
下面是使用 Python 编写的完整解决方案。我们将其封装在一个类中,符合 LeetCode 的风格:
from typing import List
class Solution:
def minElement(self, nums: List[int]) -> int:
def to_sum(x):
return sum(int(i) for i in str(x))
return min(to_sum(num) for num in nums)
💡 函数说明:
to_sum(x):将整数x转换为字符串,遍历每一位字符,转为整数后相加;min(... for num in nums):用生成器表达式求所有元素的数位和,并返回最小值。
这种写法不仅简洁,而且执行效率也不错。
🔬 测试用例
你可以这样测试你的代码:
sol = Solution()
print(sol.minElement([38, 12, 7])) # 输出:3
print(sol.minElement([101, 2, 99])) # 输出:2
print(sol.minElement([999, 888, 777])) # 输出:21
🚀 进阶思考:数位和的多次处理
如果题目进一步要求我们反复进行数位求和,直到结果变成一位数,那我们可以使用“数根”(digit root)概念进行优化。例如:
def digit_root(n):
while n >= 10:
n = sum(int(d) for d in str(n))
return n
甚至可以用数学技巧优化为:
def digit_root(n):
return 9 if n == 0 else (n % 9 or 9)
🧠 总结
这道题是对字符串、数字操作和列表生成表达式的一个很好练习。掌握这种题型,你就能在 Python 中更加熟练地使用内置函数进行快速处理,提升代码质量和可读性。
关键词回顾:
- 数位和(digit sum)
- 列表推导
min()函数- 类型注解
List[int]
如果你对 Python 的算法题解法感兴趣,可以关注我,我们将持续分享 LeetCode、牛客网等平台上的优质题目讲解与代码实现!
330

被折叠的 条评论
为什么被折叠?



