【20260707 每日一题】LeetCode 3754. 整数数位拆解与组合 I
题意与数位题眼
给你一个整数 n,将所有【非零数字】按原顺序【连接起来】得到 x,求 x 乘以 x 的【数字和】。
看到以下 3 个核心词,直接锁定数位(Digit)类型题:
- 【非零数字】 :审视 0 到 9 的每个单独格子(代码对应:
if d != 0)。 - 【连接起来】 :像积木一样拼数字,属于数位组合(代码对应:
x + d * factor)。 - 【数字和】 :拆开求和,如 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
浙公网安备 33010602011771号