LeetCode的这道题感觉比较有意思,记录一下。
问题描述:
当第一眼看到这个题目时感觉很简单,但实际完成时还是花了一点功夫。这道题可以大致分为三个部分来完成。
- 一.确定相加后整数有几位,并开辟相应大小的空间
- 二.将两数相加,并且存到新开辟的数组中去
- 三.反转数组
接下里我们来具体分析一下
第一步:
首先我们我们需要确定相加后整数的是几位数,根据位数开辟相应的空间即可。数组的大小我们几位ASize,我们只需求出K是几位数即可(用一个while循环便可实现),在与数组的位数进行比较即可。
第二步:
将两数相加,并且存到新开辟的数组中去(这一步比较复杂,因为需要考虑到进位的问题,并且是从整数的低位,所以需要第三步的反转)具体分析如下
第三步:
完成第二步之后,这道题相当于解决了,最后在反转便是我们要求的结果了。
void reverse(int* arr, int left, int right)
{
while (left <= right)
{
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int* addToArrayForm(int* A, int ASize, int K, int* returnSize) {
//获取最大位数
int tmp = K;
int knum = 0;
while (tmp)
{
knum++;
tmp /= 10;
}
//开空间,考虑最高位的进位
int newArraySize = ASize > knum ? ASize + 1 : knum + 1;
int* newArray = (int*)malloc(sizeof(int) * newArraySize);
//模拟加法的运算,从低位开始相加
int i = 0;
int idx = ASize - 1;
int step = 0;
while (idx >= 0 || K > 0)
{
//当前位的加法
newArray[i] = step;
if (idx >= 0)
newArray[i] += A[idx];
if (K > 0)
newArray[i] += K % 10;
//更新进位
if (newArray[i] > 9)
{
newArray[i] -= 10;
step = 1;
}
else
{
step = 0;
}
//继续下一位的加法运算
idx--;
K /= 10;
i++;
}
//判断最高位是否有进位
if (step == 1)
newArray[i++] = 1;
//逆转
reverse(newArray, 0, i - 1);
*returnSize = i;
return newArray;
}