【LeetCode】重新格式化电话号码 Java 题解
题目描述
给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。
请你按下述方式重新格式化电话号码。
首先,删除 所有的空格和破折号。其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:2 个数字:单个含 2 个数字的块。3 个数字:单个含 3 个数字的块。4 个数字:两个分别含 2 个数字的块。最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。
返回格式化后的电话号码。
思路分析
今天的算法题目是字符串题目,题目要求我们重新格式化电话号码。具体分析题意,需要两大步骤,第一步,我们需要删除字符串中所有的空格和破折号。第二步,按照给定的规则重新排列电话号码。
对于第一步,我们需要对输入的字符串进行遍历,只保留数字,可以直接调用 Character.isDigit(), 也可以自己写一个 ch >= '0' && ch <= '9' 的判断。
对于第二步,当每 3 个分组完成之后, 剩下的 4 个或者更少数字, 当剩下的是数字是 4 的时候,我们需要拆分成 2 个 2 个数字长度的字符串。当剩下的是数字是 4 的时候 2 或者 3 的时候,直接截取拼接就可以。
思路分析清楚之后,我们需要来实现代码,由于是字符串的频繁修改,我们一般是使用 StringBuilder,在使用 StringBuilder 类的优点是,每次都会对 StringBuilder 对象本身进行操作,而不是生成新的对象。这样可以节省大量的空间,提升我们算法程序的代码执行效率。
具体实现代码如下,供参考。
通过代码
总结
上述算法的时间复杂度是 O(n),空间复杂度是 O(1)
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【Albert】的原创文章。
原文链接:【http://xie.infoq.cn/article/81af19faac0f0a235b9c0fcae】。文章转载请联系作者。
评论