题目
方案一 我的思路
-
遍历字符串,把所有数字挑选出来,存储在StringBuilder sb中
-
再创建一个StringBuilder res,用于存储最终要返回的结果
-
题目要求的是,每3个数字分为一组,直到剩下4个或更少的数字,剩下的数字按照下述规定再分块:
- 2个数字:单个含2个数字的块
- 3个数字:单个含3个数字的块
- 4个数字:两个分别含两2个数字的块
-
找规律
- 如果sb的长度%3=1,那么,前面都是3个数字一组,最后肯定剩下4个数字,然后两两组合
- 如果sb的长度%3=2,那么,前面都是3个数字一组,最后肯定剩下2个数字,组合在一起
- 如果sb的长度%3=0,也就是说,sb的长度刚好是3的倍数,那么,全部都是3个数字一组
class Solution {
public String reformatNumber(String number) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < number.length(); i++) {
if (number.charAt(i) >= '0' && number.charAt(i) <= '9') {
sb.append(number.charAt(i));
}
}
StringBuilder res = new StringBuilder();
int i;
if (sb.length() % 3 == 1) {
i = 0;
while (i < sb.length() - 4) {
res.append(sb.substring(i, i + 3)).append('-');
i += 3;
}
while (i < sb.length()) {
res.append(sb.substring(i, i + 2)).append('-');
i += 2;
}
res.deleteCharAt(res.length() - 1);
} else if (sb.length() % 3 == 2) {
i = 0;
while (i < sb.length() - 2) {
res.append(sb.substring(i, i + 3)).append('-');
i += 3;
}
res.append(sb.substring(i, i + 2));
} else {
i = 0;
while (i < sb.length()) {
res.append(sb.substring(i, i + 3)).append('-');
i += 3;
}
res.deleteCharAt(res.length() - 1);
}
return res.toString();
}
}
方案二 官方 找出所有的数字并分块
首先对给定的字符串number进行一次遍历,找出所有的数字,并记录在字符串digits中。如果使用的语言不支持可修改的字符串,也可以记录再数组中。
随后,对digits进行一次遍历。在遍历的过程中,可以存储剩余的数字数量n以及当前遍历到的字符位置pt:
- 当 n > 4 n > 4 n>4 时,取出三个连续的字符,作为一个块
- 当 n ≤ 4 n \le 4 n≤4 时,根据题目要求,将剩余的字符进行分块,并结束遍历
还需要在不同的块之间添加破折号
- 可以在遍历的过程中添加破折号,并在遍历完成后直接返回答案
- 也可以在遍历结束后再添加破折号【官方给出的是,使用join() API得到答案。这应该是说用Python来解题时可以这么用】
class Solution {
public String reformatNumber(String number) {
StringBuilder digits = new StringBuilder();
char num;
for (int i = 0; i < number.length(); i++) {
num = number.charAt(i);
if (num >= '0' && num <= '9') {
digits.append(num);
}
}
int len = digits.length();
int pos = 0;
StringBuilder res = new StringBuilder();
while (len > 4) {
res.append(digits.substring(pos, pos + 3)).append('-');
pos += 3;
len -= 3;
}
if (len == 4) {
res.append(digits.substring(pos, pos + 2)).append('-')
.append(digits.substring(pos + 2, pos + 4));
} else {
res.append(digits.substring(pos, pos + len));
}
return res.toString();
}
}