2026-03-18:移除十进制表示中的所有零。用go语言,给定一个正整数 n,把它的十进制表示中出现的所有“0”字符删掉,返回剩下数字拼成的新整数。 输入一个正整数 n,去除其十进制形式里的所有
2026-03-18:移除十进制表示中的所有零。用go语言,给定一个正整数 n,把它的十进制表示中出现的所有“0”字符删掉,返回剩下数字拼成的新整数。
输入一个正整数 n,去除其十进制形式里的所有零,输出去零后的数值。
对正整数 n,剔除表示中的所有 0 位,返回由剩余数字组成的整数。
1 <= n <= 1000000000000000。
输入: n = 1020030。
输出: 123。
解释:
从 1020030 中移除所有的零后,得到 123。
题目来自力扣3726。
分步描述:
-
从最低位(个位)向最高位逐位处理整数 n 的每一位数字。
-
初始时,设定一个乘数 pow10 为 1,它记录在构建结果时当前位应乘的 10 的幂。
-
当 n 大于 0 时,循环执行以下操作:
a. 取 n 对 10 取模,得到当前最低位数字 d。
b. 将 n 整除 10,移除已处理的最低位。
c. 如果当前位数字 d 不等于 0,则把 d 乘上当前的 pow10 累加到结果 ans 中,并将 pow10 乘以 10,为处理下一位做准备。
d. 如果当前位数字 d 等于 0,则直接跳过,不对 ans 和 pow10 做任何改动。 -
当 n 变为 0 时,循环结束,ans 中就是所有非零数字从高位到低位的顺序拼接出的整数。
-
以 n = 1020030 为例:
• 初始 n=1020030, ans=0, pow10=1• 第1轮:d=0,跳过,n变为102003
• 第2轮:d=3,ans=0+3×1=3,pow10=10,n变为10200
• 第3轮:d=0,跳过,n变为1020
• 第4轮:d=0,跳过,n变为102
• 第5轮:d=2,ans=3+2×10=23,pow10=100,n变为10
• 第6轮:d=0,跳过,n变为1
• 第7轮:d=1,ans=23+1×100=123,pow10=1000,n变为0
• 循环结束,返回 ans=123。
复杂度分析:
• 总的时间复杂度为 O(log₁₀ n),即 n 的十进制位数,因为循环次数与位数成正比。
• 总的额外空间复杂度为 O(1),只用了固定几个整型变量,与输入规模无关。
Go完整代码如下:
package main
import (
"fmt"
)
func removeZeros(n int64) (ans int64) {
pow10 := int64(1)
for ; n > 0; n /= 10 {
d := n % 10
if d > 0 {
ans += d * pow10
pow10 *= 10
}
}
return
}
func main() {
n := int64(1020030)
result := removeZeros(n)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
def remove_zeros(n: int) -> int:
ans = 0
pow10 = 1
while n > 0:
d = n % 10
if d > 0:
ans += d * pow10
pow10 *= 10
n //= 10
return ans
def main():
n = 1020030
result = remove_zeros(n)
print(result)
if __name__ == "__main__":
main()

C++完整代码如下:
#include <iostream>
long long removeZeros(long long n) {
long long ans = 0;
long long pow10 = 1;
while (n > 0) {
long long d = n % 10;
if (d > 0) {
ans += d * pow10;
pow10 *= 10;
}
n /= 10;
}
return ans;
}
int main() {
long long n = 1020030;
long long result = removeZeros(n);
std::cout << result << std::endl;
return 0;
}
