移除字符串中的尾随零

标签: 字符串

难度: Easy

给你一个用字符串表示的正整数 num ,请你以字符串形式返回不含尾随零的整数 num

示例 1:

输入:num = "51230100"
输出:"512301"
解释:整数 "51230100" 有 2 个尾随零,移除并返回整数 "512301" 。

示例 2:

输入:num = "123"
输出:"123"
解释:整数 "123" 不含尾随零,返回整数 "123" 。

提示:

  • 1 <= num.length <= 1000
  • num 仅由数字 09 组成
  • num 不含前导零

Submission

运行时间: 26 ms

内存: 16.3 MB

class Solution:
    def removeTrailingZeros(self, num: str) -> str:
        count = 0
        ReverseNum = num[::-1]
        for numindex in ReverseNum:
            if numindex == "0":
                count = count + 1
            else:
                break

        return num[0: len(num) - count]

Explain

该题解的基本思路是首先将输入的数字字符串进行反转,这样尾随的零就变成了字符串的开头。然后通过遍历反转后的字符串来统计连续的零的数量。遍历过程中,一旦遇到一个非零字符,就停止计数。最后,原始字符串的尾部零的数量就是反转字符串开头的零的数量。使用这个计数来从原始字符串中切除相应数量的字符,从而去除尾随零。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def removeTrailingZeros(self, num: str) -> str:
        # 初始化计数器为0,用于计数尾随的零
        count = 0
        # 反转字符串,使尾随零转到字符串开头
        ReverseNum = num[::-1]
        # 遍历反转后的字符串,计算连续零的数量
        for numindex in ReverseNum:
            if numindex == '0':
                count += 1
            else:
                break
        
        # 返回切掉尾随零后的字符串
        return num[0: len(num) - count]

Explore

选择反转字符串是为了简化逻辑和统计过程。直接在反转后的字符串开始部分计数零,可以一旦遇到非零字符立即停止,这使得代码更加直观易懂。如果从原字符串末尾开始,虽然可以避免整个字符串的反转,但在实现时需要处理更多边界条件,例如从末尾开始的索引控制。反转方法提供了一种清晰且容易实现的方式。

如果输入的字符串完全由零组成,例如'0000',根据算法逻辑,会计算这四个零,然后从原字符串中去除这四个字符。因此,返回的结果将是一个空字符串。在实际应用中,可能需要对这种情况做特殊处理,例如返回'0'而不是空字符串,以确保输出总是有效的数字字符串。

反转整个字符串涉及到额外的时间和空间成本,尤其是当字符串非常长时。字符串反转操作的时间复杂度为O(n),且需要O(n)的额外空间来存储反转后的字符串。在面对极大长度的字符串时,这可能会对性能有一定影响。如果性能是一个关键考量,可以考虑直接从原字符串的末尾开始遍历,这样可以避免字符串反转的开销,直接操作原字符串,从而提高效率。