持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
题目描述
给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。
请你按下述方式重新格式化电话号码。
首先,删除 所有的空格和破折号。 其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块: 2 个数字:单个含 2 个数字的块。 3 个数字:单个含 3 个数字的块。 4 个数字:两个分别含 2 个数字的块。 最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。
返回格式化后的电话号码。
示例 1:
输入:number = "1-23-45 6"
输出:"123-456"
解释:数字是 "123456"
步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。
步骤 2:剩下 3 个数字,将它们放入单个含 3 个数字的块。第 2 个块是 "456" 。
连接这些块后得到 "123-456" 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reformat-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法题目是字符串题目,题目要求我们重新格式化电话号码。具体分析题意,需要两大步骤,第一步,我们需要删除字符串中所有的空格和破折号。 第二步,按照给定的规则重新排列电话号码。
- 对于第一步,我们需要对输入的字符串进行遍历,只保留数字,可以直接调用 Character.isDigit(), 也可以自己写一个ch >= '0' && ch <= '9' 的判断。
- 对于第二步,当每3个分组完成之后, 剩下的4个或者更少数字, 当剩下的是数字是4的时候,我们需要拆分成2个2个数字长度的字符串。当剩下的是数字是4的时候2或者3的时候,直接截取拼接就可以。
- 思路分析清楚之后,我们需要来实现代码,由于是字符串的频繁修改,我们一般是使用 StringBuilder,在使用 StringBuilder 类的优点是,每次都会对 StringBuilder 对象本身进行操作,而不是生成新的对象。这样可以节省大量的空间,提升我们算法程序的代码执行效率。
- 具体实现代码如下,供参考。
通过代码
class Solution {
public String reformatNumber(String number) {
StringBuilder digits = new StringBuilder();
for (char ch : number.toCharArray()) {
if (Character.isDigit(ch)) {
digits.append(ch);
}
}
int n = digits.length();
int idx = 0;
StringBuilder ans = new StringBuilder();
while (n > 0) {
if (n > 4) {
ans.append(digits,idx, idx + 3);
ans.append("-");
idx += 3;
n -= 3;
} else {
if (n == 4) {
ans.append(digits,idx, idx + 2);
ans.append("-");
ans.append(digits,idx + 2, idx + 4);
} else {
ans.append(digits, idx, idx + n);
}
break;
}
}
return ans.toString();
}
}
总结
- 上述算法的时间复杂度是O(n),空间复杂度是O(1)
- 坚持算法每日一题,加油!