写点什么

【LeetCode】重新格式化电话号码 Java 题解

作者:Albert
  • 2022 年 10 月 01 日
    北京
  • 本文字数:1337 字

    阅读完需:约 4 分钟

题目描述

给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。


请你按下述方式重新格式化电话号码。


首先,删除 所有的空格和破折号。其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:2 个数字:单个含 2 个数字的块。3 个数字:单个含 3 个数字的块。4 个数字:两个分别含 2 个数字的块。最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。


返回格式化后的电话号码。


示例 1:
输入:number = "1-23-45 6"输出:"123-456"解释:数字是 "123456"步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123" 。步骤 2:剩下 3 个数字,将它们放入单个含 3 个数字的块。第 2 个块是 "456" 。连接这些块后得到 "123-456" 。

来源:力扣(LeetCode)链接:https://leetcode.cn/problems/reformat-phone-number著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法题目是字符串题目,题目要求我们重新格式化电话号码。具体分析题意,需要两大步骤,第一步,我们需要删除字符串中所有的空格和破折号。第二步,按照给定的规则重新排列电话号码。

  • 对于第一步,我们需要对输入的字符串进行遍历,只保留数字,可以直接调用 Character.isDigit(), 也可以自己写一个 ch >= '0' && ch <= '9' 的判断。

  • 对于第二步,当每 3 个分组完成之后, 剩下的 4 个或者更少数字, 当剩下的是数字是 4 的时候,我们需要拆分成 2 个 2 个数字长度的字符串。当剩下的是数字是 4 的时候 2 或者 3 的时候,直接截取拼接就可以。

  • 思路分析清楚之后,我们需要来实现代码,由于是字符串的频繁修改,我们一般是使用 StringBuilder,在使用 StringBuilder 类的优点是,每次都会对 StringBuilder 对象本身进行操作,而不是生成新的对象。这样可以节省大量的空间,提升我们算法程序的代码执行效率。

  • 具体实现代码如下,供参考。

通过代码

class Solution {    public String reformatNumber(String number) {        StringBuilder digits = new StringBuilder();        for (char ch : number.toCharArray()) {            if (Character.isDigit(ch)) {                digits.append(ch);            }        }
int n = digits.length(); int idx = 0; StringBuilder ans = new StringBuilder(); while (n > 0) { if (n > 4) { ans.append(digits,idx, idx + 3); ans.append("-"); idx += 3; n -= 3; } else { if (n == 4) { ans.append(digits,idx, idx + 2); ans.append("-"); ans.append(digits,idx + 2, idx + 4); } else { ans.append(digits, idx, idx + n); } break; } } return ans.toString(); }}
复制代码

总结

  • 上述算法的时间复杂度是 O(n),空间复杂度是 O(1)

  • 坚持算法每日一题,加油!

发布于: 刚刚阅读数: 3
用户头像

Albert

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】重新格式化电话号码Java题解_LeetCode_Albert_InfoQ写作社区