带着刚刷题的你一步步学会刷题:989. 数组形式的整数加法

news/2024/10/23 5:39:31/

这是一道很经典的题目啊,考的就是数字数组转换,思路不难,但是在写的时候一步一步改代码,去优化复杂度,也是有助于学习的,今天刷了一下,也分享出来,建议刚开始刷题的友友们可以做一做。

示例 1:

输入:num = [1,2,0,0], k = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

示例 2:

输入:num = [2,7,4], k = 181
输出:[4,5,5]
解释:274 + 181 = 455

示例 3:

输入:num = [2,1,5], k = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021

下面就带大家一步一步去ac这道题

拿到这题首先想的就是把num数组转化为数字,然后和k相加之后,再转为数组

思路很简单啊,我pa的一下,诶很快,代码就出来了

 vector<int> addToArrayForm(vector<int>& num, int k) {long temp=0;for(auto x:num){temp=temp*10+x;}int sum=temp+k;vector<int>res;while(sum!=0){int tt=sum%10;sum/=10;res.push_back(tt);}reverse(res.begin(),res.end());return res;}

 本以为过了,可惜呀力扣测试数据int会溢出,那么数组转数字还能溢出,数字转数组总不可能溢出了吧

那么我们下来的思路就是把k转为数组和num去相加,我们是从尾巴去往前加

pa的一下代码又出来了

 vector<int> addToArrayForm(vector<int>& num, int k) {//num转int会溢出那么k转vector不会了吧vector<int>vv;while(k!=0){vv.push_back(k%10);k/=10;}reverse(vv.begin(),vv.end());int i=num.size()-1,j=vv.size()-1;vector<int>res;int count=0;while(i>=0&&j>=0){int temp=num[i--]+vv[j--]+count;if(temp>=10){res.insert(res.begin(),temp-10);count=1;}else{res.insert(res.begin(),temp);count=0;}}while(i>=0){int temp=num[i--]+count;if(temp>=10){res.insert(res.begin(),temp-10);count=1;}else{res.insert(res.begin(),temp);count=0;}}while(j>=0){int temp=vv[j--]+count;if(temp>=10){res.insert(res.begin(),temp-10);count=1;}else{res.insert(res.begin(),temp);count=0;}}if(count==1)res.insert(res.begin(),1);return res;}

这一版的代码可以ac了,不过挺慢的,又是翻转又是额外定义res数组

写到这里我们思路基本就打开了,想着就是怎么去优化了

既然能相加了,我们干嘛需要额外再创建一个res数组了,我们直接在原数组num上面去操作,这样的话我们把k转为数组之后,不知道num和k哪个大,我们想要的是短的数组加在长的数组上面,因此呢我们做个长度的判断,让num是长的数组

这样优化就能快一些了

 vector<int> addToArrayForm(vector<int>& num, int k) {//num转int会溢出那么k转vector不会了吧vector<int>vv;while(k!=0){vv.insert(vv.begin(),k%10);k/=10;}//改进了 直接加到num上if(num.size()<vv.size())swap(num,vv);//往长的数组上加int i=num.size()-1,j=vv.size()-1;int count=0;while(i>=0&&j>=0){int temp=num[i]+vv[j]+count;if(temp>=10){num[i]=temp-10;count=1;}else{num[i]=temp;count=0;}i--;j--;}while(i>=0){int temp=num[i]+count;if(temp>=10){num[i]=temp-10;count=1;}else{num[i]=temp;count=0;}i--;}if(count==1)num.insert(num.begin(),1);return num;}

写到这呢其实就ok了。

不过有了思路,再多想一下,我们不要k转数组了,直接就从题目给的k去加到num数组上,这样应就是最快的了,不过怎么处理就有点点难想了,代码很简单

照着模拟一遍就能懂了

while里面的if判断是每当i减到头之后发现k还有数字,说明还需要往前添进位,所以才会有了insert的操作,将i赋值成0,再次进入一下循环把进位的值加上。其实就是如果有需要,多补了开头一位

效果等于上面两版我们的代码最后进行的count标志位的判断,如果count等于1,还需要进一位

vector<int> addToArrayForm(vector<int>& A, int K) {int i = A.size()-1;while(K > 0){A[i] += K;K = A[i] / 10;A[i--] %= 10;if(i < 0 && K > 0){A.insert(A.begin(),0);i = 0;}}return A;}

这样的代码时间空间都是最优的 

今天的分享就到这里了,一道简单题,帮助刚开始刷题的朋友去学会优化思路和代码


http://www.ppmy.cn/news/9998.html

相关文章

Cadence PCB仿真使用Allegro PCB SI导入其他板卡的层叠结构的方法图文教程

⏪《上一篇》   🏡《总目录》   ⏩《下一篇》 目录 1,概述2,导入方法3,总结1,概述 本文详细介绍使用Allegro PCB SI PCB仿真软件导入其他电路板层叠结构的方法。 2,导入方法 第1步:打开待仿真的PCB文件,并确认软件为Allegro PCB SI 如果,打开软件不是Allegro PC…

【Vue路由】路由守卫、生命周期钩子、路由器工作模式

文章目录生命周期钩子案例实现总结路由守卫全局路由守卫独享守卫组件内守卫总结路由器的两种工作模式总结生命周期钩子 我们在News组件列表中的第一行加一个渐变文字。同时原来的路由缓存功能也要保存。 案例分析&#xff1a; 我们实现这个渐变的效果&#xff0c;是使用周期定…

获取Java集合中泛型的Class对象

直接获取时获取不到的&#xff0c;类型被虚拟机擦除了 泛型的正常工作是依赖编译器在编译源码的时候&#xff0c;先进行类型检查&#xff0c;然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。编译器在编译时擦除了所有类型相关的信息&#xff0c;所以…

实验二十四 策略路由配置

实验二十四 策略路由配置实验要求&#xff1a; 某企业通过路由器AR1连接互联网&#xff0c;由于业务儒要&#xff0c;与两家运营商ISPA和ISPB相连。 企业网内的数据流从业务类型上可以分为两类&#xff0c; 一类来自于网络172.16.0.0/16&#xff0c;另 一类 来自于网络172.17.0…

FreeMen正式上线,让工作更自由

“让工作更自由”&#xff0c;开屏页上六个大字宣告着FreeMen正式上线&#xff0c;全新的FreeMen APP也正式登录各大手机应用市场。作为一款专注IT技术者圈子的APP&#xff0c;其上线标志着助力程序员职业道路上向前迈进一大步。 FreeMen相关负责人表示&#xff0c;基本上10个职…

【华为机试真题详解】不含 101 的数(二)【2022 Q4 | 100分】

文章目录 前言题目解析参考代码前言 《华为机试真题详解 Python实现》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优),不能保证通过…

Spring Boot整合Junit

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 Spring Boot读取配置文件内容的三种方式_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、搭建SpringBoot工程 二、引入starter-test起步依赖 三、编…

Android 12 蓝牙适配 Java版

Android 12.0蓝牙适配前言正文一、Android版本中蓝牙简介二、新建项目① 配置build.gradle② 配置AndroidManifest.xml三、打开蓝牙① 打开蓝牙意图② 请求BLUETOOTH_CONNECT权限意图四、蓝牙扫描① 扫描者② 扫描回调③ 扫描方法④ 执行扫描⑤ 应用不推导物理位置五、页面显示…