持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
题目
给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。
请你按下述方式重新格式化电话号码:
首先,删除 所有的空格和破折号。
其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
2 个数字:单个含 2 个数字的块。
3 个数字:单个含 3 个数字的块。
4 个数字:两个分别含 2 个数字的块。
最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块,返回格式化后的电话号码。
举例:"1-23-45 6" -> "123-456" ,"--17-5 229 35-39475 "->"175-229-353-94-75"
题目要求描述看似复杂,总结理解就是字符串需要以3个数字为一组组合,但剩余最后组合不能以1个数字被分割。那么最后情况是4个或是2个的情况需要特殊处理。
解题思路
根据题意可知字符串前端都是以3个数字为一组,计算出字符串数字总长度并计算最后剩余数字是否被3整除来处理特殊情况。特殊情况如下:
- 余数为1表示剩余最后一段需要空出4个数字出来进行分割。
- 余数为2表示最后一段就是两个数字。
- 余数为0表示字符串正好是3的倍数完美分割。
遍历拼接解法
- 先将字符串中数字字符找出拼接,逢3就添加"-"。
- 遍历同时记录数字字符长度,结束后根据长度判断特殊情况。
- 特殊情况主要是解题思路中提到的三种情况:余0则需要删除多余添加的"-";余2不需要做操作;余1则需要删除添加的"-",重新添加分割的"-"。
public String reformatNumber(String number) {
int count = 0;
StringBuilder stringBuilder = new StringBuilder();
for(int i =0;i<number.length();i++){
char text = number.charAt(i);
if(text != '-' && text != ' '){
count++;
stringBuilder.append(text);
if(count % 3 == 0){
stringBuilder.append("-");
}
}
}
/// 条件判断
if( count % 3 == 1){
stringBuilder.deleteCharAt(stringBuilder.length()-2);
stringBuilder.insert(stringBuilder.length()-2,"-");
return stringBuilder.toString();
}else if(count % 3 == 2){
return stringBuilder.toString();
}else {
stringBuilder.deleteCharAt(stringBuilder.length()-1);
return stringBuilder.toString();
}
}
先拼接再插入-法
- 首先遍历找出所有数字字符。
- 设定数字字符总长度和拼接起始位置。
- 开始先以3个为一组拼接并增加"-"。
- 当剩余长度小于等于4时做特殊判断(同解题思路判断),长度余4则中间分割,其余情况只拼接字符串即可。
public String reformatNumber(String number) {
StringBuilder digits = new StringBuilder();
for (int i = 0; i < number.length(); ++i) {
char ch = number.charAt(i);
if (Character.isDigit(ch)) {
digits.append(ch);
}
}
int n = digits.length();
int pt = 0; // 起始位置
StringBuilder ans = new StringBuilder();
while (n > 0) { // 直到长度剩余0为止
if (n > 4) { // 大于4前一直3个一组分割
ans.append(digits.substring(pt, pt + 3) + "-");
pt += 3; // 起始位置增加
n -= 3; // 剩余长度减小
} else {
if (n == 4) { // 剩余长度等于4时特殊处理
ans.append(digits.substring(pt, pt + 2) + "-" + digits.substring(pt + 2, pt + 4));
} else { // 剩余情况是2或者3直接拼接即可
ans.append(digits.substring(pt, pt + n));
}
break;
}
}
return ans.toString();
}
参考
- 题目来源:力扣(LeetCode)