刷题的日常-重新格式化电话号码

72 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

刷题的日常-2022年10月1号

一天一题,保持脑子清爽

重新格式化电话号码

来自leetcode的 1694 题,题意如下:

给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。
请你按下述方式重新格式化电话号码。
首先,删除 所有的空格和破折号。
其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:

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

理解题意

我们可以从题意中提取的条件如下:

  • 题目给出一个字符串
  • 要求我们去除所有非数字的字符
  • 按三个一组重新格式化字符串
  • 如果字符串最后不足5个,则规则如下
    • 4个字符的话,分割成两个一组
    • 2个和3个的情况直接拼接上就可以
    • 不允许出现一个的情况

做题思路

题目比较简单,直接模拟即可

  • 首先将所有的数字字符提取出来,并记录所有数字的长度
  • 从前往后遍历已经查找到的数字字符
  • 如果当前剩下的字符大于4个,则循环直接拼接3个上去
  • 最后将剩下的字符按照规则放进去即可

代码实现

代码实现如下:

public class Solution {
    public String reformatNumber(String number) {
        char[] numArr = new char[number.length()];
        int idx = -1, wteIdx = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < number.length(); i++) {
            char c = number.charAt(i);
            if (c - '0' < 0 || c - '0' > 9) {
                continue;
            }
            numArr[++idx] = c;
        }
        while (wteIdx + 3 < idx) {
            for (int i = 0; i < 3; i++) {
                sb.append(numArr[wteIdx++]);
            }
            sb.append('-');
        }
        if (wteIdx == idx - 1) {
            sb.append(numArr[wteIdx++]).append(numArr[wteIdx++]);
        }
        if (wteIdx == idx - 2) {
            sb.append(numArr[wteIdx++]).append(numArr[wteIdx++]).append(numArr[wteIdx++]);
        }
        if (wteIdx == idx - 3) {
            sb.append(numArr[wteIdx++]).append(numArr[wteIdx++])
                    .append('-')
                    .append(numArr[wteIdx++]).append(numArr[wteIdx++]);
        }
        return sb.toString();
    }
}

94b22752a81a663a30015d8053fcc5f.jpg