LeetCode 每日一题详解:连接非零数字并乘以其数字和 II
LeetCode 每日一题详解:连接非零数字并乘以其数字和 II
今天刷题的时候遇到了一道挺有意思的题目,LeetCode 第 3756 题——“连接非零数字并乘以其数字和 II”。乍一看描述有点绕,但只要把逻辑拆解开,其实考查的是我们对字符串处理和数学运算的细粒度控制。
题目背景与核心逻辑
这道题的核心要求其实就两个步骤:
- 处理原始数字:提取出所有非零的数字,并将它们按顺序连接起来,形成一个新的数字。
- 运算与返回:计算这个新数字每一位的“数字和”,然后用新数字乘以这个数字和,返回最终结果。
听起来是不是很简单?但“坑”往往就藏在简单的描述里。比如,如果原始数字全是 0 怎么办?或者连接后的数字非常大,会不会导致溢出?这些都是我们在写代码时需要提前考虑好的细节。
解题思路拆解
为了确保代码的健壮性,我们可以分两步走:
解题思路流程图:重构数字与计算数字和
第一步:重构数字
我们需要遍历原始数字的每一位。这里有一个技巧,与其把数字先转成字符串再遍历,不如不断地取模和除法(val % 10 和 val / 10)。这样效率更高,也更符合算法题的“原生”感觉。
- 遇到 0 就跳过,不处理。
- 遇到非零数字,就把它拼接到结果数字上。
注意:拼接的顺序很重要。我们通常是从个位开始遍历的,所以拼接时要小心位置权重的变化,或者先收集起来再反转。
第二步:计算数字和与最终积
拿到重构后的数字(假设称之为 newNum),我们需要计算它的“数字和”。这一步同样可以通过循环取模来实现,把每一位加起来。
最后,直接返回 newNum * digitSum 即可。
代码实现(Python 示例)
Python 代码实现示例
下面给出一个比较清晰的 Python 实现,照顾了逻辑的易读性:
def solve(original_num):
# 第一步:连接非零数字
digits = []
temp = original_num
# 处理特殊情况:如果原数字是0,或者全是0
if temp == 0:
return 0 # 根据题意,这里需要确认具体逻辑,假设无非零数字则为0
while temp > 0:
digit = temp % 10
if digit != 0:
digits.append(str(digit))
temp //= 10
if not digits:
return 0
# 因为是从低位取的,所以需要反转回来,或者按顺序拼接(取决于题目对“连接”的定义)
# 题目通常指保持原数字中的相对顺序
digits.reverse()
new_num = int(''.join(digits))
# 第二步:计算数字和
digit_sum = 0
temp_for_sum = new_num
while temp_for_sum > 0:
digit_sum += temp_for_sum % 10
temp_for_sum //= 10
return new_num * digit_sum
可能遇到的坑与优化
在实际编码过程中,有几个容易被忽略的点:
- 大小写问题:不要看错题目变量名,比如
num还是nums。 - 全零情况:如果输入数字是
1000,经过第一步处理,非零数字为空。这时候new_num算作多少?通常是 0 或者不适用,根据题目具体约束条件处理。在上述代码中,我默认返回了 0。 - 整数溢出:虽然 Python 能够自动处理大整数,但如果你是用 Java 或 C++,就要小心拼接后的数字会不会超过
int范围,必要时可能需要用long甚至大数类。
总结
这道题虽然贴着“每日一题”的标签,看似简单,但它很好地锻炼了我们处理边界条件和数字拆分的能力。对于正在准备面试的朋友来说,这是一种非常经典的“模拟类”题目,关键点在于细心和逻辑的完整性。
如果你有更优的解法或者发现了其他有趣的边界情况,欢迎在评论区交流!

评论已关闭