千位分隔数

标签: 字符串

难度: Easy

给你一个整数 n,请你每隔三位添加点(即 "." 符号)作为千位分隔符,并将结果以字符串格式返回。

示例 1:

输入:n = 987
输出:"987"

示例 2:

输入:n = 1234
输出:"1.234"

示例 3:

输入:n = 123456789
输出:"123.456.789"

示例 4:

输入:n = 0
输出:"0"

提示:

  • 0 <= n < 2^31

Submission

运行时间: 20 ms

内存: 16.5 MB

class Solution:
    def thousandSeparator(self, n: int) -> str:
        n = str(n)
        n_digit = len(n)
        if n_digit < 4:
            return n
        else:
            result = ''
            for i in range((n_digit-1)//3):
                if i == 0:
                    result = '.' + n[-3:]
                else:
                    result = '.' + n[-3*(i+1):-3*i] + result
            remain = n_digit % 3
            if remain == 0:
                result = n[:3] + result
            else:
                result = n[:remain] + result
            return result

Explain

该题解首先将整数转换为字符串,以便于处理每个字符。接着,根据字符串的长度决定是否需要添加分隔符。如果字符串长度小于4,直接返回原字符串。对于长度大于等于4的情况,通过从字符串末尾开始,每三个字符插入一个分隔符'.'来构造结果。使用一个循环,每次迭代添加一个'.'和之后的三个字符。循环结束后,根据字符串长度是否能被3整除,决定如何处理前面剩余的字符。最终返回构造好的字符串。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def thousandSeparator(self, n: int) -> str:
        n = str(n)  # 将整数n转换为字符串
        n_digit = len(n)  # 计算字符串的长度
        if n_digit < 4:  # 如果长度小于4,直接返回
            return n
        else:
            result = ''  # 初始化结果字符串
            for i in range((n_digit-1)//3):  # 按每三位进行循环处理
                if i == 0:
                    result = '.' + n[-3:]  # 添加最后三位和分隔符
                else:
                    result = '.' + n[-3*(i+1):-3*i] + result  # 添加新的三位和分隔符
            remain = n_digit % 3  # 计算剩余位数
            if remain == 0:
                result = n[:3] + result  # 如果刚好被3整除,添加前三位
            else:
                result = n[:remain] + result  # 添加剩余的不足三位
            return result

Explore

选择长度小于4的界限是因为,根据题目要求,只有当数字的位数达到或超过4位时才需要添加分隔符。对于3位及以下的数字,其长度不足以形成一个完整的千位分割组(即没有足够的空间插入分隔符),因此直接返回原始数字的字符串形式是合理且符合题目要求的。

在处理非常大的数字时,这种基于字符串的循环添加分隔符的方法效率较低。尽管字符串操作在Python中相对高效,但每次插入分隔符都可能涉及到字符串的拷贝和重新构建,这在数字非常大时会导致效率下降。如果数字位数极大,这种方法的时间和空间复杂度会上升,因为每次循环都可能生成新的字符串对象。

为了确保在数字长度正好是3的倍数时不在字符串最前面错误地添加一个分隔符,题解中采用了一个条件检查。通过判断剩余位数(`remain`)是否为0来决定如何添加剩余的位数。如果`remain`为0,意味着整个数字可以完全按每三位进行分割,不需要在最前面添加分隔符。题解中通过这种方式处理,确保了不会在不适当的位置添加分隔符,从而得到正确格式化的输出。