【算法】重新格式化电话号码

89 阅读2分钟

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

题目

给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。

请你按下述方式重新格式化电话号码:

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

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

2 个数字:单个含 2 个数字的块。

3 个数字:单个含 3 个数字的块。

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

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

举例:"1-23-45 6" -> "123-456" ,"--17-5 229 35-39475 "->"175-229-353-94-75"

题目要求描述看似复杂,总结理解就是字符串需要以3个数字为一组组合,但剩余最后组合不能以1个数字被分割。那么最后情况是4个或是2个的情况需要特殊处理。

解题思路

根据题意可知字符串前端都是以3个数字为一组,计算出字符串数字总长度并计算最后剩余数字是否被3整除来处理特殊情况。特殊情况如下:

  1. 余数为1表示剩余最后一段需要空出4个数字出来进行分割。
  2. 余数为2表示最后一段就是两个数字。
  3. 余数为0表示字符串正好是3的倍数完美分割。

遍历拼接解法

  1. 先将字符串中数字字符找出拼接,逢3就添加"-"。
  2. 遍历同时记录数字字符长度,结束后根据长度判断特殊情况。
  3. 特殊情况主要是解题思路中提到的三种情况:余0则需要删除多余添加的"-";余2不需要做操作;余1则需要删除添加的"-",重新添加分割的"-"。
	public String reformatNumber(String number) {
        int count = 0;
        StringBuilder stringBuilder = new StringBuilder();
        for(int i =0;i<number.length();i++){
           char text = number.charAt(i);
           if(text != '-' && text != ' '){
                count++;
                stringBuilder.append(text);
                if(count % 3 == 0){
                     stringBuilder.append("-");
                }
           }
        }
        /// 条件判断
        if( count % 3 == 1){
            stringBuilder.deleteCharAt(stringBuilder.length()-2);
            stringBuilder.insert(stringBuilder.length()-2,"-");
            return stringBuilder.toString();
        }else if(count % 3 == 2){
            return stringBuilder.toString();
        }else {
            stringBuilder.deleteCharAt(stringBuilder.length()-1);
            return stringBuilder.toString();
        }
    }

先拼接再插入-法

  1. 首先遍历找出所有数字字符。
  2. 设定数字字符总长度和拼接起始位置。
  3. 开始先以3个为一组拼接并增加"-"。
  4. 当剩余长度小于等于4时做特殊判断(同解题思路判断),长度余4则中间分割,其余情况只拼接字符串即可。
    public String reformatNumber(String number) {
        StringBuilder digits = new StringBuilder();
        for (int i = 0; i < number.length(); ++i) {
            char ch = number.charAt(i);
            if (Character.isDigit(ch)) {
                digits.append(ch);
            }
        }

        int n = digits.length();
        int pt = 0; // 起始位置
        StringBuilder ans = new StringBuilder();
        while (n > 0) { // 直到长度剩余0为止
            if (n > 4) { // 大于4前一直3个一组分割
                ans.append(digits.substring(pt, pt + 3) + "-");
                pt += 3; // 起始位置增加
                n -= 3; // 剩余长度减小
            } else {
                if (n == 4) { // 剩余长度等于4时特殊处理
                    ans.append(digits.substring(pt, pt + 2) + "-" + digits.substring(pt + 2, pt + 4));
                } else { // 剩余情况是2或者3直接拼接即可
                    ans.append(digits.substring(pt, pt + n));
                }
                break;
            }
        }
        return ans.toString();
    }

参考