美文网首页图解LeetCode算法
图解LeetCode——1694. 重新格式化电话号码(难度:简

图解LeetCode——1694. 重新格式化电话号码(难度:简

作者: 爪哇缪斯 | 来源:发表于2022-09-30 01:59 被阅读0次

一、题目

给你一个字符串形式的电话号码 numbernumber 由数字、空格 ' '、和破折号 '-' 组成。
请你按下述方式重新格式化电话号码。

首先:删除 所有的空格和破折号。

其次:将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:

2 个数字:单个含 2 个数字的块。
3 个数字:单个含 3 个数字的块。
4 个数字:两个分别含 2 个数字的块。

最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且最多 生成两个含 2 个数字的块。返回格式化后的电话号码。

二、示例

2.1> 示例 1:

【输入】number = "1-23-45 6"
【输出】"123-456"

2.2> 示例 2:

【输入】number = "123 4-567"
【输出】"123-45-67"

2.3> 示例 3:

【输入】number = "123 4-5678"
【输出】"123-456-78"

2.4> 示例 4:

【输入】number = "12"
【输出】"12"

2.5> 示例 5:

【输入】number = "--17-5 229 35-39475 "
【输出】"175-229-353-94-75"

提示:

  • 2 <= number.length <= 100
  • number 由数字和字符 '-'' ' 组成。
  • number 中至少含 2 个数字。

三、解题思路

3.1> 思路1:先去掉空格和破折号,再拼装结果

步骤一:根据题意,我们可以先利用replaceAll(...)方法去掉number字符串中的空格破折号。然后,针对这种处理过number字符串,我们来首先判断,如果它的长度小于4,则直接作为结果返回。

步骤二:然后,如果它的长度大于4,我们每次获取number中的3个字符,拼装新的结果字符串,其中用破折号进行分割,每次循环,我们都会将number的总长度减去3,这样,当最终总长度不满足大于4的时候,跳出while循环即可。

步骤三:最后,我们在针对末尾是4个数字的情况,拼装为2个数字 + '-' + 2个数字的情况;或者,单个含2个或3个数字的块。具体实现,请参见 4.1> 实现1:先去掉空格和破折号,再拼装结果

3.2> 思路2:遍历每个字符的同时进行结果拼装

步骤一:我们也可以先通过调用chatAt(...)的方法,遍历number字符串中的每个字符,只有当它是数字字符的时候,才执行结果的拼装。那么,每当拼装了3个数字字符的时候,我们就在其末尾加上破折号,以此类推,直到遍历完number字符串中的所有字符。

步骤二:由于在步骤一种,我们的组装规则就是“3个数字 + ‘-’”,所以,在步骤二中,我们要“修复”一下末尾数字了,即:末尾4个数字、2个数字、3个数字的情况。那么怎么判断末尾数字个数呢? 我们可以在步骤一种,创建一个count变量,用于统计符合数字字符的个数。当满足count % 3 == 1的时候,说明末尾是4个数字,否则,是2个或3个数字。

那么针对末尾是4个数字的情况,我们需要先移除掉最后一个破折号,然后再将4个数字拼装为2个数字 + '-' + 2个数字。代码实现为:

result.deleteCharAt(result.length() - 2);
result.insert(result.length() - 2, '-');

针对末尾是2个数字/3个数字的情况,由于不需要破折号分割,所以不做任何处理即可。具体实现,请参见 4.2> 实现2:遍历每个字符的同时进行结果拼装

四、代码实现

4.1> 实现1:先去掉空格和破折号,再拼装结果

class Solution {
    public String reformatNumber(String number) {
        number = number.replaceAll(" ", "").replaceAll("-", "");
        int numLength = number.length(), start = 0;
        if (numLength < 4) return number;
        StringBuilder result = new StringBuilder();
        while(numLength > 4) {
            result.append(number, start, start + 3).append("-");
            start +=3;
            numLength -=3;
        }

        if (numLength == 4) 
            result.append(number, start, start + 2).append("-").append(number, start + 2, number.length());
        else
            result.append(number, start, number.length());
        return result.toString();
    }
}

4.2> 实现2:遍历每个字符的同时进行结果拼装

class Solution {
    public String reformatNumber(String number) {
        StringBuilder result = new StringBuilder();
        int count = 0;
        for (int i = 0; i < number.length(); i ++) {
            if (number.charAt(i) < '0' || number.charAt(i) > '9') continue;
            if (count != 0 && count % 3 == 0) result.append('-');
            result.append(number.charAt(i));
            count++;
        }

        if (count % 3 == 1) {
            result.deleteCharAt(result.length() - 2);
            result.insert(result.length() - 2, '-');
        } 
        return result.toString();
    }
}

4.3> 额外提示:采用replaceAll方法处理,结果速度会慢很多

class Solution {
    public String reformatNumber(String number) {
        number = number.replaceAll(" ", "").replaceAll("-", "");
        if (number.length() < 4) return number;

        StringBuilder result = new StringBuilder();
        for (int i = 0; i < number.length(); i ++) {
            if (i != 0 && i % 3 == 0) result.append('-');
            result.append(number.charAt(i));
        }

        if (number.length() % 3 == 1) {
            result.deleteCharAt(result.length() - 2);
            result.insert(result.length() - 2, '-');
        } 
        return result.toString();
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(o)/ ~ 「干货分享,每天更新」

相关文章

网友评论

    本文标题:图解LeetCode——1694. 重新格式化电话号码(难度:简

    本文链接:https://www.haomeiwen.com/subject/lyorartx.html