每日力扣-重新格式化电话号码

103 阅读2分钟

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

每日力扣是一个专门用来讲力扣中国每天发布的每日一题的栏目。本专栏不提供题目的解答源码,只讲解思路,目的是养成每日刷题、提高自己手感,从而达到算法熟练的目标。

题目(已做删减处理)

重新格式化电话号码。首先,删除 所有的空格和破折号。其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:2 个数字:单个含 2 个数字的块。3 个数字:单个含 3 个数字的块。4 个数字:两个分别含 2 个数字的块。

分析

  1. 首先着一道简单的算法题目(力扣自评:easy)。对于题目中要求的删除、分块,无疑是最轻松的部分,对于 JAVA 来说,删除使用常见的 String 类函数repalce()即可。我们可以这么写:
String s = number.replace(" ", "").replace("-", "");
  1. 分块。因为是 3个一组,所以无论如何,都需要进行遍历了。但是因为有分块的要求,因此我们在处理遍历的时候,需要做对应的改变,即:从最常见的 i++,改成 i+3
for(int i=0;i<s.length();i+3){
}
  1. 特殊分块。特殊的主要分为2、3、4、大于4。对于 2 和 3 ,我们直接存入到组装的字符串即可。因此可以这么写:
if(s.length()-i==3||s.length()-i==2){
}

对于数字 4,我们需要的是拆分成 2 个分块。因此需要直接将字符串切分:

if(s.length()-i==4) {
s.substring(i,i+2)).append("-").append(s.substring(i+2,s.length());
}

对于大于 4 的数字,我们先占用3个作为分块,中间用'-'进行分割即可:

if(s.length()-i>4) {
s.substring(i,i+3)).append("-");
}

总结

这是一道常见的有关模拟的算法题。

可以说,本道题目很典型,具有模拟算法题的常见解题思路和步骤。虽然这道题目并没有什么难度,但是在一些小细节上,比如大于4的时候如何分块,为了防止重复遍历,如何处理变量i的值,都是我们在解题的时候需要考虑的。本道题目虽然在力扣上被评估为easy题目,但是线下面试中,尤其是白板coding中,可以把它归结为middle(偏简单)级别的题目。能够不借助编译器提示,白板一次性完成AC的,算法可以说已经入门了。

结题证明

image.png