0


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

文章目录


🐲前言

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


🎈一、题目描述

给你一个字符串形式的电话号码

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" 。

示例 2:

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

示例 3:

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

示例 4:

输入:number = "12"
输出:"12"

示例 5:

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

提示:示例 5:

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

🧨二、思路解析

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

官方题解击败的对手:

我们的题解击败的对手:

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

我们先拿 **示例3 **分析:

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

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

'-'

来连接每个块。

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

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

输入:number = "--17-5 229 35-39475 "
输出:"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.官方的代码

class Solution {
public:
    string reformatNumber(string number) {
        string digits;
        for (char ch: number) {
            if (isdigit(ch)) {
                digits.push_back(ch);
            }
        }

        int n = digits.size();
        int pt = 0;
        string ans;
        while (n) {
            if (n > 4) {
                ans += digits.substr(pt, 3) + "-";
                pt += 3;
                n -= 3;
            }
            else {
                if (n == 4) {
                    ans += digits.substr(pt, 2) + "-" + digits.substr(pt + 2, 2);
                }
                else {
                    ans += digits.substr(pt, n);
                }
                break;
            }
        }
        return ans;
    }
};

🥳2.我们的代码

class Solution {
public:
    string reformatNumber(string number) {
        string ans; // 记录最终结果
        int count = 0; // 用于计数

        // 先遍历一遍number字符串,遇到数字就将其拿出来添加到字符串ans中,
        // 每添加3个数字后,当遇到第4个数字的时候就在前多添加一个破折号 '-'来连接每个块。
        for (auto ch : number)
        {
            if (ch != ' ' && ch != '-')
            {
                if (count == 3)
                {
                    ans += '-';
                    count = 0;
                }

                ans += ch;
                ++count;
            }
        }

        // 最后我们判断一下字符串ans中最后一个块是否只有一个数字,
        // 如果最后一个块只有一个数字,我们就把倒数第二个字符与倒数第三个字符交换一下位置
        if (ans.size() % 4 == 1)
        {
            swap(ans[ans.size() - 3], ans[ans.size() - 2]);
        }

        return ans;
    }
};

🐉总结

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

标签: 算法 leetcode c++

本文转载自: https://blog.csdn.net/qq_64042727/article/details/127133311
版权归原作者 不一样的烟火a 所有, 如有侵权,请联系我们删除。

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

还没有评论