持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
刷题的日常-2022年10月1号
一天一题,保持脑子清爽
重新格式化电话号码
来自leetcode的 1694 题,题意如下:
给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。
请你按下述方式重新格式化电话号码。
首先,删除 所有的空格和破折号。
其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
- 2 个数字:单个含 2 个数字的块。
- 3 个数字:单个含 3 个数字的块。
- 4 个数字:两个分别含 2 个数字的块。
- 最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。
返回格式化后的电话号码。
理解题意
我们可以从题意中提取的条件如下:
- 题目给出一个字符串
- 要求我们去除所有非数字的字符
- 按三个一组重新格式化字符串
- 如果字符串最后不足5个,则规则如下
- 4个字符的话,分割成两个一组
- 2个和3个的情况直接拼接上就可以
- 不允许出现一个的情况
做题思路
题目比较简单,直接模拟即可
- 首先将所有的数字字符提取出来,并记录所有数字的长度
- 从前往后遍历已经查找到的数字字符
- 如果当前剩下的字符大于4个,则循环直接拼接3个上去
- 最后将剩下的字符按照规则放进去即可
代码实现
代码实现如下:
public class Solution {
public String reformatNumber(String number) {
char[] numArr = new char[number.length()];
int idx = -1, wteIdx = 0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < number.length(); i++) {
char c = number.charAt(i);
if (c - '0' < 0 || c - '0' > 9) {
continue;
}
numArr[++idx] = c;
}
while (wteIdx + 3 < idx) {
for (int i = 0; i < 3; i++) {
sb.append(numArr[wteIdx++]);
}
sb.append('-');
}
if (wteIdx == idx - 1) {
sb.append(numArr[wteIdx++]).append(numArr[wteIdx++]);
}
if (wteIdx == idx - 2) {
sb.append(numArr[wteIdx++]).append(numArr[wteIdx++]).append(numArr[wteIdx++]);
}
if (wteIdx == idx - 3) {
sb.append(numArr[wteIdx++]).append(numArr[wteIdx++])
.append('-')
.append(numArr[wteIdx++]).append(numArr[wteIdx++]);
}
return sb.toString();
}
}