• 【LeetCode每日一题】2022-10-01 1694. 重新格式化电话号码 Java实现


    题目

    在这里插入图片描述
    在这里插入图片描述

    方案一 我的思路

    1. 遍历字符串,把所有数字挑选出来,存储在StringBuilder sb中

    2. 再创建一个StringBuilder res,用于存储最终要返回的结果

    3. 题目要求的是,每3个数字分为一组,直到剩下4个或更少的数字,剩下的数字按照下述规定再分块:

      • 2个数字:单个含2个数字的块
      • 3个数字:单个含3个数字的块
      • 4个数字:两个分别含两2个数字的块
    4. 找规律

      • 如果sb的长度%3=1,那么,前面都是3个数字一组,最后肯定剩下4个数字,然后两两组合
      • 如果sb的长度%3=2,那么,前面都是3个数字一组,最后肯定剩下2个数字,组合在一起
      • 如果sb的长度%3=0,也就是说,sb的长度刚好是3的倍数,那么,全部都是3个数字一组

    在这里插入图片描述

    class Solution {
        public String reformatNumber(String number) {
    
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < number.length(); i++) {
                if (number.charAt(i) >= '0' && number.charAt(i) <= '9') {
                    sb.append(number.charAt(i));
                }
            }
            StringBuilder res = new StringBuilder();
            int i;
            if (sb.length() % 3 == 1) {
                i = 0;
                while (i < sb.length() - 4) {
                    res.append(sb.substring(i, i + 3)).append('-');
                    i += 3;
                }
                while (i < sb.length()) {
                    res.append(sb.substring(i, i + 2)).append('-');
                    i += 2;
                }
    
                res.deleteCharAt(res.length() - 1);
    
            } else if (sb.length() % 3 == 2) {
    
                i = 0;
                while (i < sb.length() - 2) {
                    res.append(sb.substring(i, i + 3)).append('-');
                    i += 3;
                }
                res.append(sb.substring(i, i + 2));
    
            } else {
    
                i = 0;
                while (i < sb.length()) {
                    res.append(sb.substring(i, i + 3)).append('-');
                    i += 3;
                }
                res.deleteCharAt(res.length() - 1);
            }
    
            return res.toString();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    方案二 官方 找出所有的数字并分块

    首先对给定的字符串number进行一次遍历,找出所有的数字,并记录在字符串digits中。如果使用的语言不支持可修改的字符串,也可以记录再数组中。

    随后,对digits进行一次遍历。在遍历的过程中,可以存储剩余的数字数量n以及当前遍历到的字符位置pt:

    • n > 4 n > 4 n>4 时,取出三个连续的字符,作为一个块
    • n ≤ 4 n \le 4 n4 时,根据题目要求,将剩余的字符进行分块,并结束遍历

    还需要在不同的块之间添加破折号

    • 可以在遍历的过程中添加破折号,并在遍历完成后直接返回答案
    • 也可以在遍历结束后再添加破折号【官方给出的是,使用join() API得到答案。这应该是说用Python来解题时可以这么用】

    在这里插入图片描述

    class Solution {
        public String reformatNumber(String number) {
    
            StringBuilder digits = new StringBuilder();
            char num;
            for (int i = 0; i < number.length(); i++) {
                num = number.charAt(i);
                if (num >= '0' && num <= '9') {
                    digits.append(num);
                }
            }
            int len = digits.length();
            int pos = 0;
            StringBuilder res = new StringBuilder();
            while (len > 4) {
                res.append(digits.substring(pos, pos + 3)).append('-');
                pos += 3;
                len -= 3;
            }
            if (len == 4) {
                res.append(digits.substring(pos, pos + 2)).append('-')
                        .append(digits.substring(pos + 2, pos + 4));
            } else {
                res.append(digits.substring(pos, pos + len));
            }
            return res.toString();
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    Compose LazyColumn 对比 RecyclerView ,谁的性能更好?
    动态路由的主流算法
    Oracle/PLSQL: To_Timestamp_Tz Function
    C#进阶09——值类型和引用类型2
    全流程分析Netty设计思路与实践
    【BUG】Windows状态栏总卡死解决办法
    掌握ThreadLocal的王者段位
    SaulLM-7B: A pioneering Large Language Model for Law
    Charles的证书下载(虚拟机)
    一文带你了解webrtc基本原理(动手实现1v1视频通话)
  • 原文地址:https://blog.csdn.net/guliguliguliguli/article/details/127131480