• 【每日一好题】官方题解看不懂,别怕我教你吊打官方题解:重新格式化电话号码


    93783c55707e4631a5130213d5150eac.gif

    文章目录


    🐲前言

    大家好啊,我是不一样的烟火a,今天我要为大家分享一道LeetCode10月1号的每日一题。我将会教大家如何写出比官方题解更简单、效率更高的代码。为了避免以后忘了时再想看就找不到了,所以建议收藏。㊗️由于今天是十一国庆节,所以我先在这里祝大家国庆节快乐。


    🎈一、题目描述

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

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

    • 首先,删除所有的空格和破折号。
    • 其次,将数组从左到右每 3 个一组分块,直到 剩下 4 个或更少数字。

    剩下的数字将按下述规定再分块:

    • 2 个数字:单个含 2 个数字的块。
    • 3 个数字:单个含 3 个数字的块。
    • 4 个数字:两个分别含 2 个数字的块。

    最后用破折号将这些块连接起来。

    注意:重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。

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

     

    示例 1:

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

    示例 2:

    1. 输入:number = "123 4-567"
    2. 输出:"123-45-67"
    3. 解释:数字是 "1234567".
    4. 步骤 1:共有超过 4 个数字,所以先取 3 个数字分为一组。第 1 个块是 "123"
    5. 步骤 2:剩下 4 个数字,所以将它们分成两个含 2 个数字的块。这 2 块分别是 "45""67"
    6. 连接这些块后得到 "123-45-67"

    示例 3:

    1. 输入:number = "123 4-5678"
    2. 输出:"123-456-78"
    3. 解释:数字是 "12345678"
    4. 步骤 1:第 1 个块 "123"
    5. 步骤 2:第 2 个块 "456"
    6. 步骤 3:剩下 2 个数字,将它们放入单个含 2 个数字的块。第 3 个块是 "78"
    7. 连接这些块后得到 "123-456-78"

    示例 4:

    1. 输入:number = "12"
    2. 输出:"12"

    示例 5:

    1. 输入:number = "--17-5 229 35-39475 "
    2. 输出:"175-229-353-94-75"

    提示:示例 5:

     

    • 2 <= number.length <= 100
    • number 由数字和字符 '-' 及 ' ' 组成。
    • number 中至少含 2 个数字。

    快速跳转题目:重新格式化电话号码

    🧨二、思路解析

    我们先来对比一下官方思路做出来,和我们的思路做出来击败的对手。

     

    官方题解击败的对手:

    f8a9ae9981614e2a84d78f5cb962c827.png

     

    我们的题解击败的对手:

    55b81087cd04445da5fc59cd3ead6a6a.png

     

     由于官方代码太复杂,而且效率也不高,所以我就直接讲解我们这种思路:

    我们先拿 示例3 分析:

    1. 输入:number = "123 4-5678"
    2. 输出:"123-456-78"

    我们直接遍历一遍number字符串,遇到数字就将其拿出来添加到字符串ans中(ans是最终要返回的字符串),每添加3个数字后,当遇到第4个数字的时候就在前多添加一个破折号 '-'来连接每个块。

    最终我们遍历完number字符串后,也就得到了我们最终想要的结果:"123-456-78"

     

    但是光一个 示例3 并不能代表什么,所以我们再来分析一下 示例 5:

    1. 输入:number = "--17-5 229 35-39475 "
    2. 输出:"175-229-353-94-75"

    我们还是先做 示例2 的动作:直接遍历一遍number字符串,遇到数字就将其拿出来添加到字符串ans中(ans是最终要返回的字符串),每添加3个数字后,当遇到第4个数字的时候就在前多添加一个破折号 '-'来连接每个块。

    我们这时得到的结果就是:

    中间结果:175-229-353-947-5

    题目说当最后只剩 4 个数字时,就形成两个分别含 2 个数字的块。所以这时大家注意观察,我们只需把倒数第二个字符(也就是 破折号‘-’)与倒数第三个字符(也就是这里的数字7)交换一下位置,就可以得到题目要求的结果了。

    最终结果:"175-229-353-94-75"

    所以根据上面这两个例子的分析,我们做这题就只需两步:

    • 先遍历一遍number字符串,遇到数字就将其拿出来添加到字符串ans中(ans是最终要返回的字符串),每添加3个数字后,当遇到第4个数字的时候就在前多添加一个破折号 '-'来连接每个块。
    • 遍历完number字符串后,判断字符串ans中最后一个块是否只有一个数字,如果最后一个块只有一个数字,我们就把倒数第二个字符(也就是 破折号‘-’)与倒数第三个字符(某个数字)交换一下位置,就可以得到我们最终结果了。

    如何判断ans中最后一个块是否只有一个数字:

    • 我们只需判断(字符串ans的长度 % 4)是否等于1 即可,这里为什么是模4呢,因为我们是三个数字为一个块,然后中间需要用 破折号‘-’ 连接,所以我们这里需要模的是4。

    🌠三、代码实现

    🤹1.官方的代码

    1. class Solution {
    2. public:
    3. string reformatNumber(string number) {
    4. string digits;
    5. for (char ch: number) {
    6. if (isdigit(ch)) {
    7. digits.push_back(ch);
    8. }
    9. }
    10. int n = digits.size();
    11. int pt = 0;
    12. string ans;
    13. while (n) {
    14. if (n > 4) {
    15. ans += digits.substr(pt, 3) + "-";
    16. pt += 3;
    17. n -= 3;
    18. }
    19. else {
    20. if (n == 4) {
    21. ans += digits.substr(pt, 2) + "-" + digits.substr(pt + 2, 2);
    22. }
    23. else {
    24. ans += digits.substr(pt, n);
    25. }
    26. break;
    27. }
    28. }
    29. return ans;
    30. }
    31. };

    🥳2.我们的代码

    1. class Solution {
    2. public:
    3. string reformatNumber(string number) {
    4. string ans; // 记录最终结果
    5. int count = 0; // 用于计数
    6. // 先遍历一遍number字符串,遇到数字就将其拿出来添加到字符串ans中,
    7. // 每添加3个数字后,当遇到第4个数字的时候就在前多添加一个破折号 '-'来连接每个块。
    8. for (auto ch : number)
    9. {
    10. if (ch != ' ' && ch != '-')
    11. {
    12. if (count == 3)
    13. {
    14. ans += '-';
    15. count = 0;
    16. }
    17. ans += ch;
    18. ++count;
    19. }
    20. }
    21. // 最后我们判断一下字符串ans中最后一个块是否只有一个数字,
    22. // 如果最后一个块只有一个数字,我们就把倒数第二个字符与倒数第三个字符交换一下位置
    23. if (ans.size() % 4 == 1)
    24. {
    25. swap(ans[ans.size() - 3], ans[ans.size() - 2]);
    26. }
    27. return ans;
    28. }
    29. };

     


    🐉总结

    今天分享的题就到这了,相信大家都能够看懂,如果大家有什么解决不了的问题,欢迎大家评论区留言或者私信告诉我。如果感觉对自己有用的话,可以点个赞或关注鼓励一下博主,我会越做越好的,感谢各位的支持。最后再次祝大家国庆节快乐。

    52a03151cde147f9a186c620169e99b1.gif

     

  • 相关阅读:
    Python - PEP572: 海象运算符
    leetcode 70.爬楼梯、322.零钱兑换、279.完全平方数
    OpenStack平台镜像优化
    基于昇腾AI 使用AscendCL实现垃圾分类和视频物体分类应用
    Lua调用C#类
    【单片机毕业设计】【mcuclub-hj-002】基于单片机的多路温度控制设计
    vue3安装vue-router
    使用Triton部署chatglm2-6b模型
    Pandas DataFrame 保存到HTML文件(附炫酷 HTML Table 模板网站)
    使用quantmod包获取金融数据及投资组合构建
  • 原文地址:https://blog.csdn.net/qq_64042727/article/details/127133311