难度简单206
整数的 数组形式 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 <= 1040 <= num[i] <= 9num不包含任何前导零,除了零本身1 <= k <= 104
思路:(C语言版本) 这道题的难点在于我们不知道两个数最高位是否还需要进位。。。。
但是我们可以确定的一个是最多只能向前进一位!为什么呢?大家想想,比如两个9相加,最高也只是18,只能向前进一位。
- 所以我们第一步先求出数组这个数字的长度与k的长度,然后取长的那个,创建一个新数组newarr,大小为长的那个数字的长度加一!
- 第二步就是从个位开始,分别分解两个数,然后求和,并且判断是否有进制位,有的话存起来,给下一位相加时候加上去,以此循环,直到两个数都分解完成。
- 最后还要判断一下是否还存着一个进制位没有加上去,有的话就给newarr的最高位加一,然后将newarr反转过来(因为我们采取先尾插后反转的方式)。
代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* addToArrayForm(int* num, int numSize, int k, int* returnSize){
int tmp = k;
int ksize = 0;
while(tmp)
{
ksize++;
tmp /= 10;
}
//求出两个长的那个
int len = ksize > numSize ? ksize + 1 : numSize + 1;
//然后创建一个len长度的新数组
int* newarr = (int*)malloc(sizeof(int)*len);
//从右往左k的每一位和数组里面的每一位相加
int ki = 0;
int ai = numSize - 1;
int next = 0;//进位
int sumi = 0;//用于赋给newarr的下标标志
while(ki < ksize || ai >= 0)
{
//分解出num的每一位
int aval = 0;
if(ai >= 0)
{
aval = num[ai];
}
//分解出k的每一位
int kval = 0;
if(ki < ksize)
{
kval = k % 10;
k /= 10;
}
int sum = kval + aval + next;
//判断一下是否需要进位
if(sum > 9)
{
sum -= 10;
next = 1;
}
else
{
next = 0;
}
//将sumi的数值赋给新数组newarr
newarr[sumi++] = sum;
ai--;
ki++;
}
//判断是否还有进位
if(next == 1)
newarr[sumi++] = 1;
//最后逆置新数组newarr
int begin = 0;
int end = sumi - 1;
while(begin < end)
{
int tmp = newarr[begin];
newarr[begin] = newarr[end];
newarr[end] = tmp;
++begin;
--end;
}
//将长度以及数组返回
*returnSize = sumi;
return newarr;
}