【20260707 每日一题】LeetCode 3754. 整数数位拆解与组合 I

题意与数位题眼

给你一个整数 n,将所有【非零数字】按原顺序【连接起来】得到 x,求 x 乘以 x 的【数字和】

看到以下 3 个核心词,直接锁定数位(Digit)类型题:

  1. 【非零数字】 :审视 0 到 9 的每个单独格子(代码对应:if d != 0)。
  2. 【连接起来】 :像积木一样拼数字,属于数位组合(代码对应:x + d * factor)。
  3. 【数字和】 :拆开求和,如 123 变成 1 + 2 + 3,属于数位累加(代码对应:digit_sum += d)。

错题复盘

  • 初版思路:用 str(n).split("0") 试图剔除 0
  • 致命盲点split 是按块分割而非按位分割。若 n = 11,split("0") 得到 ['11'],导致 sum_x 错误地计算为 11(正确应为 1 + 1 = 2)。

双解法精炼

解法一:字符串模拟(直观、防错)

逐字符遍历,避免 split 连带非零数字成块的问题。

class Solution:
    def sumAndMultiply(self, n: int) -> int:
        s = [c for c in str(n) if c != '0']
        if not s: 
            return 0
        
        x = int("".join(s))
        sum_x = sum(int(c) for c in s)
        return x * sum_x

解法二:纯数学剥离(高效、标准模版)

运用 % 10// 10 从低位往高位遍历。

关键点factor 只有在 d != 0 时才翻倍(factor *= 10),用于紧凑拼接,不为 0 留空位。

class Solution:
    def sumAndMultiply(self, n: int) -> int:
        digit_sum = 0
        x = 0
        factor = 1  
        
        while n > 0:
            d = n % 10
            digit_sum += d
            if d != 0:
                x = x + d * factor
                factor *= 10  # 遇 0 不累计,保证非零数字紧凑组合
            n //= 10  
            
        return x * digit_sum

posted @ 2026-07-07 13:01  菠萝包与冰美式  阅读(15)  评论(0)    收藏  举报