3300. 替换为数位和以后的最小元素

Python 数组题实战:替换为数位和后取最小值(LeetCode 风格解题)

在日常刷题或技术面试中,经常会遇到处理数组以及数位操作的题目。今天我们来分享一道非常典型的练习题:将整数数组中每个元素替换为它的各位数字之和,并返回替换后数组中的最小值

这题虽然不难,但它融合了几个常见的技能点,比如:列表推导、字符串操作、内置函数使用、最小值查找等。如果你正在学习 Python,或者准备算法面试,这道题是个不错的练手项目。


🧾 题目描述

给定一个整数数组 nums,请你:

  1. nums 中的每一个元素替换为它的各个数位之和;
  2. 返回替换后数组中的最小值。

📌 示例说明

假设输入数组如下:

nums = [38, 12, 7]

我们逐个处理:

  • 38 的数位和是 3 + 8 = 11
  • 12 的数位和是 1 + 2 = 3
  • 7 是个位数,数位和就是它本身

所以替换后的数组是:

[11, 3, 7]

返回的结果是最小值 3


🔧 解题思路

我们可以按以下步骤来实现这个问题:

  1. 定义一个函数 digit_sum(x) 用来求某个数的各位数之和;
  2. 遍历数组 nums,将每个元素替换为 digit_sum(num)
  3. 对新的数组应用 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、牛客网等平台上的优质题目讲解与代码实现!

### 处理数据分列后的长字符串 为了确保数据分列后得到的长字符串中的最后四位数字为0,可以通过编程方式实现这一需求。具体来说,在Python环境中操作较为简便。 #### 使用 Python 修改字符串方法 假设有一个包含多位数字符组成的字符串列表,目标是将这些字符串中每一个元素的最后一部分即最后四位替换为'0000': ```python def modify_last_four_digits(data_list): modified_data = [] for item in data_list: # 如果长度不足五位,则直接填充到至少五位后再做处理 if len(item) >= 4: new_item = item[:-4] + '0000' else: new_item = '0000'[len(item):] + item.replace(item, '0'*len(item)) modified_data.append(new_item) return modified_data ``` 此函数遍历输入的数据列表`data_list`,对于每个条目检查其长度是否大于等于四;如果满足条件则保留前面的部分不变而仅改变最右侧四个字符为零;如果不满足,则整个字符串被替换成相应数量的‘0’来达到最小宽度的要求[^1]。 另外一种情况可能是面对的是DataFrame形式存储的大批量记录而非简单的字符串数组。此时可以利用pandas库来进行更高效的操作: ```python import pandas as pd df = pd.DataFrame({'col': ['abcde1234', 'fghij5678']}) # 定义转换逻辑并应用于每一行 df['modified_col'] = df['col'].apply(lambda x: x[:-4]+'0000' if len(x)>=4 else ('0000'[-len(x):]+x).replace(x,'0'*len(x))) print(df[['col','modified_col']]) ``` 这段代码创建了一个新的列`modified_col`用于保存经过上述规则调整过的结果,并打印原始值与修改后的对比表单[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值