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

这篇具有很好参考价值的文章主要介绍了【每日一好题】官方题解看不懂,别怕我教你吊打官方题解:重新格式化电话号码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

文章目录

🐲前言

🎈一、题目描述

🧨二、思路解析

🌠三、代码实现

🤹1.官方的代码

🥳2.我们的代码

 文章来源地址https://www.toymoban.com/news/detail-407806.html

🐉总结


🐲前言

大家好啊,我是不一样的烟火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;
    }
};

 


🐉总结

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

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

 

到了这里,关于【每日一好题】官方题解看不懂,别怕我教你吊打官方题解:重新格式化电话号码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3年测试技术面一题都看不懂,字节面试真的变态.....

    最近我的一个读者朋友去了字节面试,来给我发信息吐槽,说字节的面试太困难了,像他这种三年经验的测试员,在技术面,居然一题都答不上来,这要多高的水平才能有资格去面试字节的测试岗位。 确实,字节作为国内互联网一线巨头企业,程序员追求的大厂,面试难点也

    2024年02月05日
    浏览(42)
  • SpringBoot-Run启动流程(源码分析)—看不懂来揍我

    目录 前言 Run()方法 1、实例化SpringApplication对象 1、加载容器 2、装配初始化器 3、装配监听器  4、加载主类 2、执行Run()方法 1、设置headless 2、启用SpringApplicationListener 3、加载Banner 1、图片Banner 2、文本Banner 4、异常报告类加载 5、准备上下文         6、刷新上下文 7、系统

    2024年02月14日
    浏览(38)
  • 看不懂微信小程序中的文件都是什么?

    小程序的主体部分由3个文件组成,这3个文件必须放在项目的主目录中,文件名也是固定的,负责小程序的整体配置。 整个小程序的入口文件,通过调用APP()函数来启动整个程序。主要用来注册小程序全局实例,编译时会和其他页面的逻辑文件打包成一个JavaScript文件。项目中

    2024年02月08日
    浏览(41)
  • 炫云为什么要采用让人看不懂的GHZ计费?

    很多人看到炫云GHZ计费都表示看不懂,觉得麻烦,没有按核数、按线程或者按分钟计费简单易懂,甚至还被某些同行经常拿来攻击。哪为什么炫云还坚持用GHZ计费呢?哪是因为使用GHZ计费更加公平、透明,且具有硬件无关性。今天就来和大家详细说说炫云为什么要用GHZ计费。

    2024年02月05日
    浏览(58)
  • SpringBoot-AOP深入浅出通俗易懂—看不懂你捶鹅

    目录 前言 AOP总体思想 AOP图解 AOP-Aspect-代码举例 1、定义Service 2. 定义LoginController 3. 定义UserLoginAspect切面 AOP-Handler拦截器-代码举例 1、定义拦截器 2、注册拦截器 总结         Spring最重要的两个思想就是IOC、AOP,之前的文章SpringBoot自动装配分析了IOC思想并进行了源码详解。这

    2024年02月14日
    浏览(51)
  • 【C++】动态内存管理(79分钟写的文章哪里看不懂了,快来学)

    动态内存管理目录: 一、C/C++内存分布  在学习了C/C++内存区域的划分后,我们来做几道题巩固一下: 1. 选择题:选项 : A.栈  B.堆  C.数据段(静态区)  D.代码段(常量区)globalVar在哪里?____  staticGlobalVar在哪里?____staticVar在哪里?____  localVar在哪里?____num1 在哪里?____char2在

    2024年02月07日
    浏览(44)
  • 看不懂来打我,vue3如何将template编译成render函数

    在之前的 通过debug搞清楚.vue文件怎么变成.js文件 文章中我们讲过了vue文件是如何编译成js文件,通过那篇文章我们知道了,template编译为render函数底层就是调用了 @vue/compiler-sfc 包暴露出来的 compileTemplate 函数。由于文章篇幅有限,我们没有去深入探索 compileTemplate 函数是如何

    2024年04月11日
    浏览(41)
  • Neo4j入门教程2(看不懂评论区随便骂)

    1. ORDER BY 承接上文,创建三个学生节点,标签为student1、student2、student3,分别拥有age属性和num属性 查看我们创建的节点得到如下结果: 以上代码,按照num属性默认对返回的学生进行升序排序 如果需要降序排序,只需要在末尾加上desc即可 2. UNION语句 先创建四只狗节点,属性

    2024年02月07日
    浏览(42)
  • 区块链基础知识(下):共识机制 附带图解、超详细教学 看不懂你打死我

          苏泽 大家好 这里是苏泽 一个钟爱区块链技术的后端开发者 本篇专栏  ← 持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~ 目录 专栏的前面几篇详细了介绍了区块链的核心基础知识 有兴趣学习的小伙伴可以看看→ 关于区块

    2024年03月13日
    浏览(53)
  • github开源推荐,自动字幕生成和字幕翻译工具——再也没有看不懂的片啦

    GitHub - qinL-cdy/auto_ai_subtitle github上开源的一款字幕生成和字幕翻译的整合工具,可以根据视频中提取到的音频来转换成字幕,再根据需要将字幕进行翻译,基于whisper 1)安装ffmpeg 安装ffmpeg的教程比较多,就不详细介绍了,Windows上安装完成后记得添加环境变量,最后在cmd中输入

    2024年02月08日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包