题目要求![](https://img-blog.csdnimg.cn/20200208225239281.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhcm14aXhp,size_16,color_FFFFFF,t_70)
看到这道题刚开始我的解题思路是将整数K分解,并依次放入一个新建好的数组中,然后同给的数组按位相加,标记进位。但是怎么把整数K分解成一个数组难倒了我。
等以后有时间我会把我的这种方法写出来 今晚实在不想动脑筋。
官方解题思路来源leetcode官方题解
这个官方解题思路真的是赞啊,一看到两数相加当然想到按位相加,对10整除求出进位和对10求模求出对应位相加的结果。这个思路要积累。
我写的代码
```cpp
class Solution {
public:
vector<int> addToArrayForm(vector<int>& A, int K)
{
int i=A.size()-1;
int tempAnswer=K;
vector<int> B;
while(tempAnswer>0||i>=0)
{
if(i>=0){
tempAnswer=tempAnswer+A[i--];}
B.push_back(tempAnswer%10);
tempAnswer=tempAnswer/10;
}
reverse(B.begin(),B.end());
return B;
}
};
notes
这里面两个点需要注意!!!
第一个就是while循环语句中的条件 要把临时相加的答案大于 0而不是>=0
如果是大于等于0那这样就会一直当加到给定整数k的最高位 由于得到的临时相加答案永远等于0 这样将会导致while循环会一直循环下去,导致超出内存限制错误的产生。这是我提交代码时出现过的问题!!1
第二个需要注意的问题就是 while循环判断语句中 两个循环条件是或的关系 所以只要其中一个满足就可以
所以还要加一个if语句 来判断数组A的下标是否小于0,如果没加这个条件,也会出现错误!!!
所以while循环条件真的很重要!!!缺一不可!!
tips
i-- 先用的是i之前的值 用完之前的值再对i进行减1操作。
昨天晚上想了好久 为什么我写的将整数转换为数组的程序就是不对呢,今天上午终于知道错误在哪里了嘿嘿嘿 ,但是运行速度是很慢的,所以还是要学习标准答案。话不多说,上代码。
class Solution {
public:
vector<int> addToArrayForm(vector<int>& A, int K) {
vector<int> b;
int tempK=K;
while(tempK>0)
{
b.push_back(tempK%10);
tempK=tempK/10;
}
reverse(b.begin(),b.end());
int p=A.size();
int q=b.size();
int length=p>=q?p-q:q-p;
if(length>0)
{
for(int i=0; i<length;++i)
{
if(p>q)
{
b.insert(b.begin(),0);
}
else
{
A.insert(A.begin(),0);
}
}
}
vector<int> result;
int Length=A.size();
int carry=0;
for(int j=Length-1;j>=0;--j)
{
result.push_back((A[j]+b[j]+carry)%10);
carry=(A[j]+b[j]+carry)/10;
}
if(carry==1)
{
result.push_back(carry);
}
reverse(result.begin(),result.end());
return result;
}
};
用到的就是2两数相加listnode的思想。刚开始运行错误的原因是因为我没把进位加进去,这里还温习了一个新的语法,就是像向量的任意位置插入元素。