leetcode
leetcode 1401 ~ 1450
千位分隔数

千位分隔数

难度:

标签:

题目描述

代码结果

运行时间: 20 ms, 内存: 16.5 MB


/*
 题目思路:
 1. 将整数转换为字符串。
 2. 将字符串转换为字符流。
 3. 使用分组和映射,将每三位字符后加点。
 4. 将流重新组合为字符串并返回。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class ThousandSeparator {
    public static String thousandSeparator(int n) {
        String str = Integer.toString(n);
        // 获取字符串长度
        int length = str.length();
        // 将字符串转换为流并处理
        return IntStream.range(0, length)
            .mapToObj(i -> (length - i - 1) % 3 == 0 && i != 0 ? "." + str.charAt(i) : String.valueOf(str.charAt(i)))
            .collect(Collectors.joining());
    }
}

解释

方法:

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

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在对数字长度小于4时直接返回字符串的处理中,有没有特定的理由选择这样的界限?
选择长度小于4的界限是因为,根据题目要求,只有当数字的位数达到或超过4位时才需要添加分隔符。对于3位及以下的数字,其长度不足以形成一个完整的千位分割组(即没有足够的空间插入分隔符),因此直接返回原始数字的字符串形式是合理且符合题目要求的。
🦆
题解中提到使用循环来每三位添加一个分隔符,这种方法在处理非常大的数字时效率如何?
在处理非常大的数字时,这种基于字符串的循环添加分隔符的方法效率较低。尽管字符串操作在Python中相对高效,但每次插入分隔符都可能涉及到字符串的拷贝和重新构建,这在数字非常大时会导致效率下降。如果数字位数极大,这种方法的时间和空间复杂度会上升,因为每次循环都可能生成新的字符串对象。
🦆
在添加分隔符的过程中,如果数字长度正好是3的倍数,如何确保不会在字符串最前面错误地添加一个分隔符?
为了确保在数字长度正好是3的倍数时不在字符串最前面错误地添加一个分隔符,题解中采用了一个条件检查。通过判断剩余位数(`remain`)是否为0来决定如何添加剩余的位数。如果`remain`为0,意味着整个数字可以完全按每三位进行分割,不需要在最前面添加分隔符。题解中通过这种方式处理,确保了不会在不适当的位置添加分隔符,从而得到正确格式化的输出。

相关问题