LeetCode每日一题:3754. 连接非零数字并乘以其数字和 I 的详细解析与代码实现
LeetCode每日一题:3754. 连接非零数字并乘以其数字和 I 的详细解析与代码实现
大家好!今天我们来看一道有趣的算法题目——LeetCode 3754“连接非零数字并乘以其数字和 I”。这道题看似简单,但实则考察了我们对数字操作的细致处理能力。如果你正在准备面试或者想锻炼一下编程思维,那可千万别错过哦!
题目分析
首先,我们来理解一下题目到底在说什么。题目给定一个正整数 n,我们需要找到所有非零的数字,把它们按顺序连接起来,形成一个新的数字。然后,我们需要计算这个新数字的数字和(Digital Sum),最后将新数字乘以这个数字和,得到的结果就是我们要返回的答案。
听起来是不是有点绕?没关系,我们举个例子就明白了。
题目处理流程演示:提取非零数字,连接并计算数字和
示例解析
假设输入 n = 234:
- 提取非零数字:2、3、4。
- 连接非零数字:234。
- 计算数字和:2 + 3 + 4 = 9。
- 计算最终结果:234 * 9 = 2106。
再比如 n = 101:
- 提取非零数字:1、1。
- 连接非零数字:11。
- 计算数字和:1 + 1 = 2。
- 计算最终结果:11 * 2 = 22。
看到这里,大家应该对题目有了更清晰的认识。接下来,我们看看如何用代码来实现它。
解题步骤的代码执行流程可视化
解题思路
第一步:提取非零数字
我们可以通过将数字转换为字符串,然后遍历每一个字符,过滤掉字符为 '0' 的部分。当然,也可以通过数学运算(取模和除法)来获取每一位数字,这里为了代码的简洁性,我选择使用字符串操作的方式。
第二步:连接非零数字
提取出来的非零数字字符,可以直接拼接成一个字符串,然后转回整数。这里需要注意的是,如果所有数字都是0(虽然题目说是正整数,但为了代码健壮性,我们可以假设这种情况),那么连接后的结果可能需要特殊处理。不过根据题目约束,我们至少会有一个非零数字。
第三步:计算数字和
数字和的计算比较简单,就是将每一位非零数字相加。在遍历提取非零数字的时候,我们可以顺便累加它们的值,这样只需要遍历一次,效率更高。
第四步:计算最终结果
最后,将连接后的数字与累加得到的数字和相乘,返回结果即可。
代码实现
这里提供一个 Python 的参考实现:
class Solution:
def findTheNumber(self, n: int) -> int:
num_str = str(n)
non_zero_digits = []
digit_sum = 0
for digit in num_str:
if digit != '0':
d = int(digit)
non_zero_digits.append(digit)
digit_sum += d
if not non_zero_digits:
return 0
# 连接非零数字
connected_num = int(''.join(non_zero_digits))
return connected_num * digit_sum
代码解释
- 初始化:将输入的整数
n转换为字符串num_str,并初始化两个列表/变量non_zero_digits和digit_sum。 - 遍历与提取:遍历
num_str中的每一个字符digit,如果它不是'0',则将其加入non_zero_digits列表,并将其整数值加到digit_sum上。 - 边界检查:如果
non_zero_digits为空(理论上不会发生),返回0。 - 连接数字:使用
''.join(non_zero_digits)将所有非零数字字符连接起来,并转换为整数connected_num。 - 计算并返回结果:返回
connected_num * digit_sum。
复杂度分析
- 时间复杂度:O(d),其中 d 是数字
n的位数。我们需要遍历数字的每一位一次。 - 空间复杂度:O(d),用于存储非零数字字符串。在最坏情况下(没有0),我们需要存储所有的数字字符。
总结
这道题目虽然难度不大,但非常考验细节处理。通过这道题,我们练习了数字的拆分、字符串与数字的转换以及基本的累加操作。在面试中,遇到这种题目,不仅要写出代码,还要清晰地表达思路,并考虑边界情况。
希望这篇解析对你有所帮助!如果你有更好的解法或者疑问,欢迎在评论区交流讨论。

评论已关闭