携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天,点击查看活动详情
题目描述
整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。
- 例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。
示例 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
提示:
- 1 <= num.length <= 10^4
- 0 <= num[i] <= 9
- num 不包含任何前导零,除了零本身
- 1 <= k <= 10^4
思路分析
采用栈存储K(数组也行)用栈主要省去反转K的操作。
相加前反转一下A,防止诸如[998]+2时,最高位无处安放。
先将A作为主人,让K里逐个去加。
K反客为主,flag(进位标志)作为客人去逐个加K里的元素。(K.size()>A.size()的情况)
AC 代码
class Solution {
public:
vector<int> addToArrayForm(vector<int>& A, int K) {
stack<int> q;
stringstream ss;
ss<<K;
string Ks;
ss>>Ks;
for(char a:Ks)
{
stringstream s2;
s2<<a;
int temp;
s2>>temp;
q.push(temp);
}
//反转A 防止最高位有进位时出错
reverse(A.begin(),A.end());
int flag = 0;//进位标志
for(int i = 0;i<A.size();++i)
{
int temp = 0;
if(!q.empty())
{
temp = q.top();
q.pop();
}
int temp2 = A[i]+temp+flag;
if(temp2>=10)
{
temp2 = temp2%10;
flag = 1;
}
else
{
flag = 0;
}
A[i] = temp2;
}
while(!q.empty())
{
int temp = q.top()+flag;q.pop();
int temp2 = 0;
if(temp>=10)
{
temp%=10;
flag = 1;
}
else flag = 0;
A.push_back(temp);
}
if(flag==1)
{
A.push_back(1);
}
reverse(A.begin(),A.end());
return A;
}
};