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