持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道相对简单的题目 -> 重新格式化电话号码
题目描述
给你一个字符串形式的电话号码 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" 。
示例 2:
输入:number = "123 4-567"
输出:"123-45-67"
解释:数字是 "1234567".
步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。
步骤 2:剩下 4 个数字,所以将它们分成两个含 2 个数字的块。这 2 块分别是 "45" 和 "67" 。
连接这些块后得到 "123-45-67" 。
示例 3:
输入:number = "123 4-5678"
输出:"123-456-78"
解释:数字是 "12345678" 。
步骤 1:第 1 个块 "123" 。
步骤 2:第 2 个块 "456" 。
步骤 3:剩下 2 个数字,将它们放入单个含 2 个数字的块。第 3 个块是 "78" 。
连接这些块后得到 "123-456-78" 。
示例 4:
输入:number = "12"
输出:"12"
示例 5:
输入:number = "--17-5 229 35-39475 "
输出:"175-229-353-94-75"
提示:
- 2 <= number.length <= 100
- number 由数字和字符 '-' 及 ' ' 组成。
- number 中至少含 2 个数字。
思路分析
首先我们应该先理解一下题目的题意,主要的规则如下:
- 首先,删除 所有的空格和破折号。
- 其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
- 2 个数字:单个含 2 个数字的块。
- 3 个数字:单个含 3 个数字的块。
- 4 个数字:两个分别含 2 个数字的块。
我们可以直接根据上面的规则来进行模拟:
1、删除 所有的空格和破折号
使用正则表达式将字符串中的空格和破折号删除
number = number.replace(/-| /g,'');
2、判断分块方式
通过字符串长度判断最后一组的分块方式:
- 余数为2:单个含 2 个数字的块
- 余数为0:单个含 3 个数字的块
- 余数为1:两个分别含 2 个数字的块
let flag = number.length % 3;
格式化电话号码
除了最后一组需要根据判断来进行分块,前面的都为3个一组。
for(let i = 0; i < number.length; i++){
if(flag == 1 && i == number.length - 2 || (ind == 3 && i != number.length - 1)){
res += '-';
ind = 0;
}
res += number[i];
ind++;
}
AC代码
/**
* @param {string} number
* @return {string}
*/
var reformatNumber = function(number) {
number = number.replace(/-| /g,'');
let res = '';
let ind = 0;
const flag = number.length % 3;
for(let i = 0; i < number.length; i++){
if(flag == 1 && i == number.length - 2 || (ind == 3 && i != number.length - 1)){
res += '-';
ind = 0;
}
res += number[i];
ind++;
}
return res;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。