文章目录
🐲前言
大家好啊,我是不一样的烟火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; } };
🐉总结
今天分享的题就到这了,相信大家都能够看懂,如果大家有什么解决不了的问题,欢迎大家评论区留言或者私信告诉我。如果感觉对自己有用的话,可以点个赞或关注鼓励一下博主,我会越做越好的,感谢各位的支持。最后再次祝大家国庆节快乐。
版权归原作者 不一样的烟火a 所有, 如有侵权,请联系我们删除。