这是一道很经典的题目啊,考的就是数字数组转换,思路不难,但是在写的时候一步一步改代码,去优化复杂度,也是有助于学习的,今天刷了一下,也分享出来,建议刚开始刷题的友友们可以做一做。
示例 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;
}
这样的代码时间空间都是最优的
今天的分享就到这里了,一道简单题,帮助刚开始刷题的朋友去学会优化思路和代码