一、题目
给你一个字符串形式的电话号码 number
。number
由数字、空格 ' '
、和破折号 '-'
组成。
请你按下述方式重新格式化电话号码。
首先:删除 所有的空格和破折号。
其次:将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
2 个数字:单个含 2 个数字的块。
3 个数字:单个含 3 个数字的块。
4 个数字:两个分别含 2 个数字的块。
最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1
个数字的块,并且最多 生成两个含 2
个数字的块。返回格式化后的电话号码。
二、示例
2.1> 示例 1:
【输入】number = "1-23-45 6"
【输出】"123-456"
2.2> 示例 2:
【输入】number = "123 4-567"
【输出】"123-45-67"
2.3> 示例 3:
【输入】number = "123 4-5678"
【输出】"123-456-78"
2.4> 示例 4:
【输入】number = "12"
【输出】"12"
2.5> 示例 5:
【输入】number = "--17-5 229 35-39475 "
【输出】"175-229-353-94-75"
提示:
-
2
<= number.length <=100
- number 由数字和字符
'-'
及' '
组成。 - number 中至少含
2
个数字。
三、解题思路
3.1> 思路1:先去掉空格和破折号,再拼装结果
步骤一:根据题意,我们可以先利用replaceAll(...)
方法去掉number字符串中的空格和破折号。然后,针对这种处理过的number
字符串,我们来首先判断,如果它的长度小于4,则直接作为结果返回。
步骤二:然后,如果它的长度大于4,我们每次获取number中的3个字符,拼装新的结果字符串,其中用破折号进行分割,每次循环,我们都会将number的总长度减去3,这样,当最终总长度不满足大于4的时候,跳出while循环即可。
步骤三:最后,我们在针对末尾是4个数字的情况,拼装为2个数字 + '-' + 2个数字
的情况;或者,单个含2个或3个数字的块。具体实现,请参见 4.1> 实现1:先去掉空格和破折号,再拼装结果

3.2> 思路2:遍历每个字符的同时进行结果拼装
步骤一:我们也可以先通过调用chatAt(...)
的方法,遍历number字符串中的每个字符,只有当它是数字字符的时候,才执行结果的拼装。那么,每当拼装了3个数字字符的时候,我们就在其末尾加上破折号,以此类推,直到遍历完number字符串中的所有字符。
步骤二:由于在步骤一种,我们的组装规则就是“3个数字 + ‘-’
”,所以,在步骤二中,我们要“修复”一下末尾数字了,即:末尾4个数字、2个数字、3个数字的情况。那么怎么判断末尾数字个数呢? 我们可以在步骤一种,创建一个count变量,用于统计符合数字字符的个数。当满足count % 3 == 1
的时候,说明末尾是4个数字,否则,是2个或3个数字。
那么针对末尾是4个数字的情况,我们需要先移除掉最后一个破折号,然后再将4个数字拼装为2个数字 + '-' + 2个数字
。代码实现为:
result.deleteCharAt(result.length() - 2);
result.insert(result.length() - 2, '-');
针对末尾是2个数字/3个数字的情况,由于不需要破折号分割,所以不做任何处理即可。具体实现,请参见 4.2> 实现2:遍历每个字符的同时进行结果拼装

四、代码实现
4.1> 实现1:先去掉空格和破折号,再拼装结果
class Solution {
public String reformatNumber(String number) {
number = number.replaceAll(" ", "").replaceAll("-", "");
int numLength = number.length(), start = 0;
if (numLength < 4) return number;
StringBuilder result = new StringBuilder();
while(numLength > 4) {
result.append(number, start, start + 3).append("-");
start +=3;
numLength -=3;
}
if (numLength == 4)
result.append(number, start, start + 2).append("-").append(number, start + 2, number.length());
else
result.append(number, start, number.length());
return result.toString();
}
}

4.2> 实现2:遍历每个字符的同时进行结果拼装
class Solution {
public String reformatNumber(String number) {
StringBuilder result = new StringBuilder();
int count = 0;
for (int i = 0; i < number.length(); i ++) {
if (number.charAt(i) < '0' || number.charAt(i) > '9') continue;
if (count != 0 && count % 3 == 0) result.append('-');
result.append(number.charAt(i));
count++;
}
if (count % 3 == 1) {
result.deleteCharAt(result.length() - 2);
result.insert(result.length() - 2, '-');
}
return result.toString();
}
}

4.3> 额外提示:采用replaceAll方法处理,结果速度会慢很多
class Solution {
public String reformatNumber(String number) {
number = number.replaceAll(" ", "").replaceAll("-", "");
if (number.length() < 4) return number;
StringBuilder result = new StringBuilder();
for (int i = 0; i < number.length(); i ++) {
if (i != 0 && i % 3 == 0) result.append('-');
result.append(number.charAt(i));
}
if (number.length() % 3 == 1) {
result.deleteCharAt(result.length() - 2);
result.insert(result.length() - 2, '-');
}
return result.toString();
}
}

今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(o)/ ~ 「干货分享,每天更新」
网友评论