当前位置: 首页 > news >正文

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

一、题目

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

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

其次:将数组从左到右 每 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^)/ ~ 「干货分享,每天更新」

相关文章:

  • 如何测试 Redis 缓存?
  • 二叉树的一些基本操作
  • 湖仓一体电商项目(二十四):合并Iceberg小文件
  • Java中如何向一个HashSet对象中添加元素呢?
  • 静态HTML CSS网站制作成品 简单的学生网页作业代码【带视频演示】
  • 达梦数据库整合在springboot的使用教程
  • 【Linux】Linux的基本指令(Linux入门、用户的创建和切换)
  • C语言进阶——动态内存管理
  • C#面向对象程序设计课程实验一:实验名称:C#语言基础、程序流程控制
  • 公司级攻防比赛常用的突破方法
  • 多线程概述(线程创建,方法(等待,通知,加入,睡眠,礼让,中断),上下文切换,死锁,守护线程与用户线程)
  • 编译方式安装nginx
  • 【第48篇】MaxViT:多轴视觉转换器
  • shell 基础
  • 《uni-app》uni-app实现疯狂点赞效果(一)
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Android开源项目规范总结
  • Brief introduction of how to 'Call, Apply and Bind'
  • LeetCode18.四数之和 JavaScript
  • mysql中InnoDB引擎中页的概念
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Vue2.x学习三:事件处理生命周期钩子
  • Web Storage相关
  • 对象管理器(defineProperty)学习笔记
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 手机app有了短信验证码还有没必要有图片验证码?
  • #ifdef 的技巧用法
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (C语言)共用体union的用法举例
  • (Python) SOAP Web Service (HTTP POST)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)jdk与jre的区别
  • (转)scrum常见工具列表
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ***利用Ms05002溢出找“肉鸡
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net - 类的介绍
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET的微型Web框架 Nancy
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .net项目IIS、VS 附加进程调试
  • .Net中的集合
  • @ModelAttribute 注解
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn
  • [C/C++]数据结构 栈和队列()
  • [C++] Windows中字符串函数的种类