当前位置: 首页 > 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实现疯狂点赞效果(一)
  • @jsonView过滤属性
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android Studio:GIT提交项目到远程仓库
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java教程_软件开发基础
  • Mocha测试初探
  • Mybatis初体验
  • node.js
  • python docx文档转html页面
  • RxJS: 简单入门
  • SSH 免密登录
  • vue数据传递--我有特殊的实现技巧
  • windows-nginx-https-本地配置
  • 给初学者:JavaScript 中数组操作注意点
  • 巧用 TypeScript (一)
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 思维导图—你不知道的JavaScript中卷
  • 异步
  • 智能网联汽车信息安全
  • 自制字幕遮挡器
  • ​ssh免密码登录设置及问题总结
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)换源+apt-get基础配置+搜狗拼音
  • (六)激光线扫描-三维重建
  • (一)Dubbo快速入门、介绍、使用
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)德国人的记事本
  • .vimrc 配置项
  • 。Net下Windows服务程序开发疑惑
  • @EventListener注解使用说明
  • @Service注解让spring找到你的Service bean
  • @test注解_Spring 自定义注解你了解过吗?
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ Linux Audio 篇 ] 音频开发入门基础知识