leetcode每日一题

article/2025/8/29 11:45:55

目录

🏆重新格式化电话号码

👓①麻烦解法

👓②使用库函数降维打击

每日鸡汤:

                🚀有志者自有千计万计,无志者只感千难万难。

🏆重新格式化电话号码

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

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

首先,删除 所有的空格和破折号。
其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:
2 个数字:单个含 2 个数字的块。
3 个数字:单个含 3 个数字的块。
4 个数字:两个分别含 2 个数字的块。
最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且 最多 生成两个含 2 个数字的块。

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

通读一遍,要求很明确,每三个当作一组,然后破折号分开当最后剩4个的时候,需要两两一组,少于4个的时候当作一组即可

这道题目的解法也很普通,遍历一遍,设新的数组去存储这些数字字符。然后我们需要malloc一个新的数组当作最后的返回数组。平平无奇,但是我想说的是,如果这道题目不妥善处理,将会很麻烦。

👓①麻烦解法

如果不使用库函数去简化代码,将很辛苦,博主第一次做的时候就是暴力遍历数字字符数组,用两个变量计算两种情况需要多少个破折号

1、第一种情况每三个数字字符为一组,用一个变量timesOf3记录有多少个破折号——,它记录的破折号用于隔离每三个数字字符,但是这里有个细节:

timesOf2记录当剩余小于等于4个字符时需要多少个破折号,比如剩余4个就需要2个破折号

 2、比较麻烦的是,我并没有使用库函数去简化代码,而是用创建变量标记,记录当每遍历到3个时,就在循环里特殊处理一下加一下‘——’。然后还需要考虑特殊情况,非常麻烦。

说明:可能有的老铁觉得为什么要计算破折号的个数,直接作减去做这道题目不是舒服点嘛,我给老铁说明一下,直接作减确实比较方便,但是我们不知道要返回的数字字符数组多大空间啊,博主主要想通过计算破折号加上原有长度当然别忘记'\0',就能精确计算到底需要多少空间,不至于空间浪费。(但事实证明大部分oj题给大点空间(一般两倍)都可以通过,有点没必要浪费代码去做这个工作😂)

char * reformatNumber(char * number)
{int length=strlen(number);char tmp[length];int count=0;for(int i=0;i<length;++i){if(number[i]!='-'&&number[i]!=' ')tmp[count++]=number[i];}//计算需要多少破折号int m=0;if(count==4){char* ret=(char*)realloc(number,sizeof(char)*7);if(ret==NULL){perror("realloc fail");exit(-1);}number=ret;int time=0;for(int i=0;i<count;++i){if(time==2){number[m++]='-';i--;time=0;}else{number[m++]=tmp[i];time++;}}}else{int timesOf3=count/3;//这里其实多了一个,后面剪去int timesOf2=0;if(count-timesOf3*3==1){//说明剩余了4timesOf3-=2;//需要少一个timesOf2=2;}else if(count-timesOf3*3==2){timesOf3-=1;timesOf2=1;}else{timesOf3-=1;}char* ret=(char*)realloc(number,sizeof(char)*(timesOf3+timesOf2+count+1));if(ret==NULL){perror("realloc fail");exit(-1);}number=ret;int time=0;int i=0;for(i=0;i<count;++i){if((count-i==4&&timesOf3==0&&timesOf2==2)||(count-i==2&&timesOf3==0&&timesOf2==1))break;if(time==3&&timesOf3>0){number[m++]='-';timesOf3--;i--;time=0;}else{number[m++]=tmp[i];time++;}}time=2;while(i<count){if(time==2&&timesOf2>0){number[m++]='-';timesOf2--;time=0;}else{number[m++]=tmp[i++];time++;}}}number[m]='\0';return number;}

时间复杂度:O(n)

空间复杂度:O(n)

👓②使用库函数降维打击

1、这道题目如果去使用库函数strncpy 

 是非常契合题目的。它可以拷贝指定大小的内容到目标空间。非常好用。这里还使用了一个库函数isdigit---int isdigit(int c) 检查所传的字符是否是十进制数字字符

2、还可以简化的地方是,不要去计算3个为一组需要多少个破折号,剩余的小于等于四个数字字符需要多少个破折号。而是不断作减法,每拷贝3个数字字符,数字字符个数减3,加破折号,当小于等于4个时就特别处理一下

char * reformatNumber(char * number)
{int length=strlen(number);char digits[length+1];int pos=0;for(int i=0;i<length;++i){char ch=number[i];if(isdigit(ch)){//是数字字符就存下来digits[pos++]=ch;}}int n=pos;//存一下数字字符个数//开辟空间--比较粗暴,其实可以计算char *ret=(char*)malloc(sizeof(char)*n*2);pos=0;int pt=0;while(n){if(n>4){strncpy(ret+pos,digits+pt,3);pos+=3;ret[pos++]='-';pt+=3;n-=3;}else{if(n==4){strncpy(ret+pos,digits+pt,2);pos+=2;ret[pos++]='-';pt+=2;strncpy(ret+pos,digits+pt,2);pos+=2;}else{strncpy(ret+pos,digits+pt,n);pos+=n;}break;}}ret[pos]='\0';return ret;}

 时间复杂度:O(N)

空间复杂度:O(N)

这道题目,其实并不难,只是提醒我们在做oj题,能使用库函数去简化,我们尽量调用库函数,也能增进我们对库函数的掌握。如果不知道用什么库函数,就看一下答案,学习优秀代码咯🚀。


http://chatgpt.dhexx.cn/article/pRt2OPOo.shtml

相关文章

题题题题题1

js 基本数据类型 7 种原始类型Boolean、Number、String、Null、Undefined、Symbol&#xff08;es6&#xff09;、BigInt、Object Symbol的理解 symbol是在es6中引入的基本数据类型、它表示的是一个独一无二的值&#xff0c;主要是来解决命名冲突的问题&#xff0c;它的使用场…

下午第一题

2017上半年 阅读下列说明和图&#xff0c;回答问题1至问题4&#xff0c;将解答填入答题纸的对应栏内。 【说明】 某医疗器械公司作为复杂医疗产品的集成商&#xff0c;必须保持高质量部件的及时供应。为了实现这一目标&#xff0c;该公司欲开发一采购系统。系统的主要功能如下:…

JS实现答题上一题下一题

以下是实现效果图 JS块代码 var TRUE_COUNT 0//正确的题数var count 10;//当前所在题数var thisURL document.URL;var getval thisURL.split(?)[1];var titleType getval.split("")[1];//获取题目typevar class_radio "selection";//选择按钮var ur…

js、jq实现答题上一题下一题

一、以下是效果图 说明&#xff1a;第一题只有一个“下一题”按钮&#xff0c;中间题目有两个按钮“上一题”“下一题”&#xff0c;最后一题按钮改为“提交”&#xff1b; 二、代码 js代码&#xff08;jquery需要自行引入&#xff09; var number document.getElementsByCl…

vue 简单实现上一题下一题问答效果

1.先来看下效果&#xff08;左上展示题目数量以及当前题序号&#xff0c;当第一题时只有下一题按钮&#xff0c;未回答问题时无法点击下一题&#xff0c;且回答结果展示错误或正确的颜色&#xff09; ​​​​ 2.接下来我们来看下html是怎么写的吧 <!-- 左边数据 --><…

MybatisPlus自动填充(建立、更新时间)

准备 1、建立user表 DROP TABLE IF EXISTS user;CREATE TABLE user (id BIGINT(20) NOT NULL COMMENT 主键ID,name VARCHAR(30) NULL DEFAULT NULL COMMENT 姓名,age INT(11) NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50) NULL DEFAULT NULL COMMENT 邮箱,PRIMARY KEY …

Jpa配置实体类创建时间更新时间自动赋值,@CreateDate,@LastModifiedDate

操作数据库映射实体类时&#xff0c;通常需要记录createTime和updateTime&#xff0c;如果每个对象新增或修改去都去手工操作创建时间、更新时间&#xff0c;会显得比较繁琐。 Springboot jpa提供了自动填充这两个字段的功能&#xff0c;简单配置一下即可。CreatedDate、LastM…

win10如何关闭自动更新及修改更新时间

关于win10如何关闭自动更新&#xff0c;有以下三个方法&#xff0c;但其效果明显不同。 当然&#xff0c;可用度最高的肯定放到最前面。 其中方法一实用性最强&#xff0c;方法二有时候没什么用&#xff0c;方法三可以延缓较长一段时间更新&#xff0c;方法四可以设置更新时间…

mybatis自动生成更新时间和创建时间

开发中&#xff0c;每次修改数据或者添加一条数据都要手动改变一次创建时间或者更新时间&#xff0c;有一说一挺麻烦的 数据表里面的创建时间和更改时间字段 更新update和insert要想自动生成的话实体类要加上TableField 然后创建MyMetaObjectHandler类&#xff0c;实现Meta…

Ubuntu修改时区和更新时间

更新时区 先查看当前系统时间 rootubuntu:/# date -R Thu, 12 Aug 2021 01:41:48 0000 结果时区是&#xff1a;-0000 我需要的是东八区&#xff0c;这儿显示不是&#xff0c;所以需要设置一个时区 运行tzselect tzselect在这里我们选择亚洲 Asia&#xff0c;确认之后选择中…

MySQL 设置 创建时间 和 更新时间

在实际应用中&#xff0c;我们时常会需要用到创建时间和更新时间这两个字段&#xff0c;下面记录一下&#xff1a; 第一种 &#xff1a; 命令行创建&#xff08;推荐&#xff09; CREATE TABLE user_info (uid varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT…

MySQL中创建时间和更新时间的自动更新

一、需求 当新增记录的时候&#xff0c;MySQL自动将系统的当前时间 set 到创建时间和更新时间这两个字段中。 当更新记录的时候&#xff0c;MySQL 只 update 更新时间字段的时间&#xff0c;而不修改创建时间字段对应的值。 二、方案 找到表中对应的创建时间和更新时间的字段…

Mysql设置自动更新时间

假设建表包括如下字段&#xff1a; id&#xff1a;主键ID create_time: 创建时间 update_time: 修改时间 如何创建table可以使得&#xff1a; 在插入记录时create_time、update_time默认为当前时间&#xff1b;在修改记录时update_time自动更新为当前时间&#xff1b; 建表语…

postgresql设置自动更新时间方法

在我们日常开发中&#xff0c;在设计数据库字段的时候不可避免的都要created_time&#xff08;创建时间&#xff09;以及updated_time&#xff08;修改时间&#xff09;两个时间戳字段&#xff0c;作用大家也都一目了然。下面将为大家详细介绍两个字段的如何去设置来达到你想要…

centos 7 更新时间和更新时区

使用 date 命令 查看当前centos7服务器的时间&#xff0c;发现当前时间与实际实际不同步。 1、下载ntpdate工具&#xff0c;使用该工具可以与时间服务器同步。 yum -y install ntp ntpdate 2、设置系统时间与网络时间同步。 ntpdate cn.pool.ntp.org 3.将系统时间写入硬件时间…

阿里国际站各数据更新时间汇总

2B平台运营 Michael Dai 1个月前 (11-10) 71次浏览 2个评论 扫描二维码 [编辑] 阿里国际站各数据更新时间汇总 昨天下午在查看关键词花费时突然发现已经过了下午3点了&#xff0c;但是关键词的推广计划没有重新开始&#xff0c;这时我才意识到直通车各计划的更新时间应该开…

MySQL中更新时间字段的更新时点问题

我们在设计表时&#xff0c;通常为了记录数据插入和更新的时间&#xff0c;会定义两个字段&#xff0c;create_time/insert_time和update_time&#xff0c;按照需求&#xff0c;记录插入的时间&#xff0c;会存储到create_time/insert_time字段中&#xff0c;记录更新的时间&am…

hexo添加文章更新时间

修改&#xff08;博客主目录&#xff09;/themes/next/layout/_macro/post.swig 文件&#xff0c;在<span class"post-time">...</span>标签后添加 {%if post.updated and post.updated > post.date%}<span class"post-updated"> |…

win10 更新计算机时间,win10更新时间太长怎么回事_windows10更新时间太久解决教程...

在使用win10系统的时候&#xff0c;经常会需要电脑进行更新&#xff0c;而我们会发现每次更新都会耗时1-2个小时时间。让人等的不耐烦&#xff0c;遇到win10更新时间太长怎么回事呢&#xff1f;接下来给大家分享一下windows10更新时间太久解决教程吧。 具体方法如下&#xff1a…

java插入或者修改数据自动更新时间字段

** 方法一:最简单 ** 在sqlyog界面打开相关的表 在要时间"更新"字段打勾 测试成功 每次修改表中数据 时间字段都会更新 ** 方法二:直接获取当前时间set到数据库 ** 例如 Transactional Override public int update(Enterprise enterprise) throws Exception{en…