Easy

题目描述

给定一个正整数 n

返回通过移除 n 的十进制表示中所有零而得到的整数。

示例 1:

输入:n = 1020030
输出:123
解释:从 1020030 中移除所有零后,我们得到 123。

示例 2:

输入:n = 1
输出:1
解释:1 的十进制表示中没有零。因此,答案是 1。

约束条件:

  • 1 <= n <= 10^15

提示:

  • 转换为字符串并过滤掉 '0' 字符。

解题思路

解题思路

这道题目要求移除一个正整数十进制表示中的所有零字符。根据题目提示,最直观的方法是将整数转换为字符串,然后过滤掉所有的 '0' 字符。

主要思路:

  1. 字符串处理法:将整数转换为字符串,遍历字符串中的每个字符,只保留非零字符,最后将结果转换回整数。

  2. 数学方法:通过取模和除法操作逐位提取数字,跳过零位,重新构建新的数字。

推荐解法:字符串处理法

  • 实现简单,逻辑清晰
  • 代码可读性强
  • 时间复杂度和空间复杂度都是可接受的

虽然数学方法在理论上可能更节省空间,但考虑到代码的简洁性和可维护性,字符串处理法是更好的选择。特别是在现代编程语言中,字符串操作已经得到了很好的优化。

需要注意的是,由于输入保证是正整数且移除零后仍然是有效数字(不会出现全零的情况),所以不需要处理边界情况。

代码实现

class Solution {
public:
    long long removeZeros(long long n) {
        string s = to_string(n);
        string result = "";
        
        for (char c : s) {
            if (c != '0') {
                result += c;
            }
        }
        
        return stoll(result);
    }
};
class Solution:
    def removeZeros(self, n: int) -> int:
        s = str(n)
        result = ""
        
        for c in s:
            if c != '0':
                result += c
        
        return int(result)
public class Solution {
    public long RemoveZeros(long n) {
        string s = n.ToString();
        string result = "";
        
        foreach (char c in s) {
            if (c != '0') {
                result += c;
            }
        }
        
        return long.Parse(result);
    }
}
var removeZeros = function(n) {
    const s = n.toString();
    let result = "";
    
    for (let c of s) {
        if (c !== '0') {
            result += c;
        }
    }
    
    return parseInt(result);
};

复杂度分析

复杂度类型大小
时间复杂度O(d)
空间复杂度O(d)

其中 d 是输入数字 n 的位数。我们需要遍历数字的每一位来检查是否为零,同时需要额外的空间来存储字符串表示和结果字符串。