LeetCode 每日一题详解:连接非零数字并乘以其数字和 II

今天刷题的时候遇到了一道挺有意思的题目,LeetCode 第 3756 题——“连接非零数字并乘以其数字和 II”。乍一看描述有点绕,但只要把逻辑拆解开,其实考查的是我们对字符串处理和数学运算的细粒度控制。

题目背景与核心逻辑

这道题的核心要求其实就两个步骤:

  1. 处理原始数字:提取出所有非零的数字,并将它们按顺序连接起来,形成一个新的数字。
  2. 运算与返回:计算这个新数字每一位的“数字和”,然后用新数字乘以这个数字和,返回最终结果。

听起来是不是很简单?但“坑”往往就藏在简单的描述里。比如,如果原始数字全是 0 怎么办?或者连接后的数字非常大,会不会导致溢出?这些都是我们在写代码时需要提前考虑好的细节。

解题思路拆解

为了确保代码的健壮性,我们可以分两步走:

Algorithm flowchart showing the two main steps: reconstructing the number and calculating the sum.

解题思路流程图:重构数字与计算数字和

第一步:重构数字

我们需要遍历原始数字的每一位。这里有一个技巧,与其把数字先转成字符串再遍历,不如不断地取模和除法(val % 10val / 10)。这样效率更高,也更符合算法题的“原生”感觉。

  • 遇到 0 就跳过,不处理。
  • 遇到非零数字,就把它拼接到结果数字上。

注意:拼接的顺序很重要。我们通常是从个位开始遍历的,所以拼接时要小心位置权重的变化,或者先收集起来再反转。

第二步:计算数字和与最终积

拿到重构后的数字(假设称之为 newNum),我们需要计算它的“数字和”。这一步同样可以通过循环取模来实现,把每一位加起来。

最后,直接返回 newNum * digitSum 即可。

代码实现(Python 示例)

Python code implementation on a dark background editor.

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

可能遇到的坑与优化

在实际编码过程中,有几个容易被忽略的点:

  1. 大小写问题:不要看错题目变量名,比如 num 还是 nums
  2. 全零情况:如果输入数字是 1000,经过第一步处理,非零数字为空。这时候 new_num 算作多少?通常是 0 或者不适用,根据题目具体约束条件处理。在上述代码中,我默认返回了 0。
  3. 整数溢出:虽然 Python 能够自动处理大整数,但如果你是用 Java 或 C++,就要小心拼接后的数字会不会超过 int 范围,必要时可能需要用 long 甚至大数类。

总结

这道题虽然贴着“每日一题”的标签,看似简单,但它很好地锻炼了我们处理边界条件和数字拆分的能力。对于正在准备面试的朋友来说,这是一种非常经典的“模拟类”题目,关键点在于细心逻辑的完整性

如果你有更优的解法或者发现了其他有趣的边界情况,欢迎在评论区交流!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭