LeetCode 1694. 重新格式化电话号码

题目
给你一个字符串形式的电话号码 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,这里搞迷糊的)的时候就开始迷糊了。最后还是看了解答写了出来,把思路理顺了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值