一、题目:
整数的 数组形式 是按照从左到右的顺序表示其数字的数组。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
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目链接
二:解题思路
这道题的思路比较简单
第一步:
对于num和k的位数进行比较,防止栈溢出的情况。在题目中,num的数组中元素的个数已经给出,那么自然它的位数就知道了,我们就只对k的位数进行计算。
int numsizek=0;
int knum=k;这里可以防止对k进行改变。用kunm来替代它。
while(knum)
{
knum/=10;
numsizek++; 这里的循环可以计算出位数的多少,如果想不明白的话可以带入相关的数来理解
}
int let=numSize>numsizek ? numSize:numsizek;这个就可以把相对大的值给let
int *retArr=(int*)malloc(sizeof(int)*(let+1)); 例如999+11它的位数就有可能比最大的那个大,
最多大一位所以我们开辟空间时,就要多开辟一
个。
第二步
就是相加起来。
我们可以一位一位的加,个位加个位,十位加十位,百位加百位等等
int Ai=numSize-1; 这个是num数组的最后一个元素。
int reti=0; 这个是我们自己开辟空间的数组元素下标。
int numDigit=0; 这个是如果位数相加大于10后它变成一,来加到下一位上。
while(let--) 这个可以循环最大位数。
{ int a=0;
if(Ai>=0)
{
a=num[Ai]; 这个1就是为了防止num中元素的个数小于k的位数的判断。
Ai--; 即使不成立了,下面的a=0也毫无影响。
}
int ret=a+k%10+numDigit; k%10是找到它的最后一位数。
k/=10; 依次去掉后面的数,来找k每个位置上的数。
if(ret>9)
{
ret-=10; 这个判断作用是相应的位数是否大于10,大于10就要进一位,然后本位还要
numDigit=1; 减10;
}
else
numDigit=0;
retArr[reti]=ret;
reti++;
}
if(numDigit==1)
{
retArr[reti]=1; 因为当numDigit为1时需要返回才能加,所以当最后一位数相加时,如果
超过了本位数,则无法加到下一位,所以我们需要在后面再下一个判断条
件,来确定需不需要进一位
++ reti;
}
第三步 :
我们所写的代码是反着的
例如:110+990=1100,我们需要的是1100
但是我们的代码是0011
所以我们需要将这个数组给倒转过来。
int left=0;
int right=reti-1;
while(left<right)
{
int rum=0;
rum=retArr[left];
retArr[left]=retArr[right];
retArr[right]=rum;
left++;
right--;
}
这样就大功告成了。
三:完整代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* addToArrayForm(int* num, int numSize, int k, int* returnSize) {
int numsizek=0;
int knum=k;
while(knum)
{
knum/=10;
numsizek++;
}
int let=numSize>numsizek ? numSize:numsizek;
int *retArr=(int*)malloc(sizeof(int)*(let+1));
int Ai=numSize-1;
int reti=0;
int numDigit=0;
while(let--)
{ int a=0;
if(Ai>=0)
{
a=num[Ai];
Ai--;
}
int ret=a+k%10+numDigit;
k/=10;
if(ret>9)
{
ret-=10;
numDigit=1;
}
else
numDigit=0;
retArr[reti]=ret;
reti++;
}
if(numDigit==1)
{
retArr[reti]=1;
++ reti;
}
int left=0;
int right=reti-1;
while(left<right)
{
int rum=0;
rum=retArr[left];
retArr[left]=retArr[right];
retArr[right]=rum;
left++;
right--;
}
*returnSize=reti;
return retArr;
}
虽然思路很简单,但是比较考察同学们的细心程度,是一道很经典的题,希望看官们能有所收获!