题目
标题和出处
标题:千位分隔数
出处:1556. 千位分隔数
难度
2 级
题目描述
要求
给你一个整数 n \texttt{n} n,请你每隔三位添加点(即 "." \texttt{"."} "." 符号)作为千位分隔符,并将结果以字符串格式返回。
示例
示例 1:
输入:
n
=
987
\texttt{n = 987}
n = 987
输出:
"987"
\texttt{"987"}
"987"
示例 2:
输入:
n
=
1234
\texttt{n = 1234}
n = 1234
输出:
"1.234"
\texttt{"1.234"}
"1.234"
示例 3:
输入:
n
=
123456789
\texttt{n = 123456789}
n = 123456789
输出:
"123.456.789"
\texttt{"123.456.789"}
"123.456.789"
示例 4:
输入:
n
=
0
\texttt{n = 0}
n = 0
输出:
"0"
\texttt{"0"}
"0"
数据范围
- 0 ≤ n < 2 31 \texttt{0} \le \texttt{n} < \texttt{2}^\texttt{31} 0≤n<231
解法
思路和算法
要给非负整数 n n n 添加千位分隔符,需要首先知道 n n n 的位数。直观的做法是将 n n n 转化成字符串,但是该做法需要多创建一个字符串。另一种做法是对整数 n n n 进行遍历,得到位数。
可以通过计算 n n n 除以 10 10 10 的余数得到 n n n 的最低位,然后使用整数除法将 n n n 除以 10 10 10,即可去掉 n n n 的最低位。重复上述操作直到 n n n 变成 0 0 0,即可知道 n n n 的位数以及从低到高的每一位的数字。
按照从低到高的顺序遍历 n n n 的每一位数字,每三位添加一个分隔符,即可在正确的位置添加千位分隔符。需要注意的是,遍历到 n n n 的最高位之后,不再添加分隔符。
例如,对于 n = 123456789 n = 123456789 n=123456789,按照从低到高的顺序遍历 n n n 的每一位数字,每三位添加一个分隔符,得到的结果是 “ 987.654.321 " \text{``}987.654.321" “987.654.321",当遍历到数位 7 7 7、 4 4 4 和 1 1 1 时,遍历的位数为 3 3 3 的倍数,数位 7 7 7 和 4 4 4 的后面各添加一个分隔符,数位 1 1 1 由于是最高位因此不在其后面添加分隔符。
按照上述方法遍历和添加分隔符之后,得到的结果和数字 n n n 相比为左右翻转之后的结果,将该结果反转即可得到数字 n n n 添加千位分隔符之后的结果。
上述做法中,按照从低到高的顺序遍历 n n n 的每一位数字的结束条件是 n n n 变成 0 0 0,对于 n > 0 n > 0 n>0 的情况都是正确的,但是对于 n = 0 n = 0 n=0 的情况就会出现错误,导致返回空字符串。因此,对于 n = 0 n = 0 n=0 的情况需要另外判断,当 n = 0 n = 0 n=0 时直接返回 “ 0 " \text{``}0" “0"。
代码
class Solution {
public String thousandSeparator(int n) {
if (n == 0) {
return "0";
}
StringBuffer sb = new StringBuffer();
int count = 0;
while (n > 0) {
sb.append(n % 10);
n /= 10;
count++;
if (count % 3 == 0 && n > 0) {
sb.append('.');
}
}
sb.reverse();
return sb.toString();
}
}
复杂度分析
-
时间复杂度: O ( log 10 n ) O(\log_{10} n) O(log10n)。需要遍历的位数和字符串长度都是 O ( log 10 n ) O(\log_{10} n) O(log10n)。
-
空间复杂度: O ( log 10 n ) O(\log_{10} n) O(log10n)。需要创建一个长度为 O ( log 10 n ) O(\log_{10} n) O(log10n) 的字符串存储添加千位分隔符之后的结果。