题目:
给你一个字符串形式的电话号码 number 。number 由数字、空格 ’ '、和破折号 ‘-’ 组成。
请你按下述方式重新格式化电话号码。
首先,删除 所有的空格和破折号。
其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
2 个数字:单个含 2 个数字的块。
3 个数字:单个含 3 个数字的块。
4 个数字:两个分别含 2 个数字的块。
最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。
返回格式化后的电话号码。
示例 :
输入:number = "1-23-45 6"
输出:"123-456"
解释:数字是 "123456"
步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。
步骤 2:剩下 3 个数字,将它们放入单个含 3 个数字的块。第 2 个块是 "456" 。
连接这些块后得到 "123-456" 。
输入:number = "123 4-567"
输出:"123-45-67"
解释:数字是 "1234567".
步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。
步骤 2:剩下 4 个数字,所以将它们分成两个含 2 个数字的块。这 2 块分别是 "45" 和 "67" 。
连接这些块后得到 "123-45-67" 。
解题思路:
- 首先先把字符串中的空格和 - 去掉,使用了JS中字符串的替换
str.replace(reg, content)
。正则表达式reg = /-|\s/g
- 然后考虑将数字加入新的字符串并用 - 连接。此时,需要考虑未加入结果字符串的字符个数。当剩余字符个数等于4时,需要分成两个俩字符的块;如果小于4,则直接将剩余的字符加入到结果字符串中。当大于4时,就直接从第一个未加入的字符开始,加入连续的三个字符到结果字符串中。
- 最后返回整个结果字符串即可。
/**
* @param {string} number
* @return {string}
*/
var reformatNumber = function (number) {
let num = number.replace(/\-|\s/g, "");
console.log(num);
let res = "";
let p = 0, len = num.length;
while (p < len) {
if (len - p > 4) {
res += num.substr(p, 3) + "-";
p += 3;
} else {
if (len - p === 4) {
res += num.substr(p, 2) + "-" + num.substr(p + 2, 2);
} else {
res += num.substr(p, len - p);
}
break;
}
}
return res;
};
一个简单题,刚开始写的挺顺,越写越迷糊。因为我定义的指针p和字符长度len,然后考虑未加入字符长度(是len - p还是len - p - 1,这里搞迷糊的)的时候就开始迷糊了。最后还是看了解答写了出来,把思路理顺了。