1 题目描述
对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。K为一个非负整数。
给定非负整数 X 的数组形式 A,返回整数 X+K 的数组形式。
1.1 题目解释
将上述枯燥的文字变为形象的图片如下:蓝色图片为数组,橙色图片展示的是一个非负整数,记为K。此题目的是为了将K的值按如图所示位置加给数组,于是展示的结果为:
X+K=[1,2,0,0]+[0,0,3,4]=[1,2,3,4];
1.2 输入输出样例
输入:A = [1,2,0,0], K = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234
2 分析过程
2.1 开辟空间存储
首先,我们需要让数组和整数相加,所以第一步:应该提取数组每位的数和整数每位的数,并判断数组和整数位数的长度(因为需要动态的开辟内存malloc,来存放需要返回的数组)并取长的那个开辟内存。
此时,还需要找出数字的位数,怎么找呢?下面代码给出解释:
//判断数字的位数
int kSize = 0;
int kNum=K;
while (kNum){//判断每位数字是否位0
++kSize;//不为零,需要将数字位数加一
kNum /= 10;
}
//从数组和数字中比较大找出来开辟内存
int len = ASize > kSize ? ASize : kSize;//ASize为数组位数大小,kSize为数字位数大小
int *retArr = (int*)malloc(sizeof(int)*(len+1));//开辟内存加一 防止进位溢出
2.2 对应位置相加
对对应位置相加,并非简单的加,还要考虑是否进位和数组是否越界
举例证明进位和数组越界:
2.2.1 数组是否会越界
上图所示,蓝色为数组,橙色为数字,当数字位数大于数组位数时,进行加法时需要注意防止数组越界。
//判断数组是否越界
int a = 0;//定义变量暂存数组第Ai位的数
if (Ai >= 0){//判断Ai位是否越界访问
a = A[Ai];
Ai--;//Ai减,继续下一位比较
}
没有越界的话,将每位的值加和保存起来;如果越界的话,数组最高位不需要改变了,直接进行数字与0的加法,然后计算每一位对应和。
//加每一位
int ret = a + K % 10 + nextNum;
K /= 10;//求数字下一位
2.2.2 是否有进位
上图所示,为进位展示,很简单,这里不再解释。下面给出进位代码和每位之和的值给数组的代码:
//判断是否有进位
if (ret > 9){
ret -= 10;//或者ret %=10;也可以
nextNum = 1;//有进位,进位必然是1,读者可以思考下
}
else{
nextNum = 0;//没有进位,将标志置位0
}
//将加和值给数组中存储
retArr[reti] = ret;//将相加的值赋值给数组中存储
++reti;//数组下标加一
其实关于进位,还有一种需要注意的是:最高位需要进位,那么我们需要进行如下判断:
//最后判断最高位相加是否大于10,大于的话有进位,否则没有进位
if (nextNum == 1){
retArr[reti] = 1;//将进位数1给数组中第reti位存储
}
2.3 将加和保存的值逆置
由于比较常见我就不做分析,不懂的可以提问。
//逆置
int left = 0;
int right = reti - 1;
while (left < right){
int temp = retArr[left];
retArr[left] = retArr[right];
retArr[right] = temp;
left++;
right--;
}
3 主函数怎么写
这是leetcode上一道很经典的习题,他需要认真分析每个细节,很锻炼考虑问题的全面性。还有就是此函数形式为:
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
此函数为输出型参数,主函数调用也需要特别注意,所以我列出我的主函数作为参考:
int main()
{
int array[] = { 1, 2, 0, 0 };
int len = sizeof(array) / sizeof(array[0]);
int key = 34;
int returnSize = 0;
int *p = addToArrayForm(array, len, key, &returnSize);
int *arr = (int *)malloc(sizeof(int)*(returnSize));//开辟returnSize大小的数组 用来存储返回的数组
arr = p;//将返回值给数组中存储
printf("%d\n", returnSize);
for (int i = 0; i < returnSize; i++)
{
printf("%d ", arr[i]);
}
system("pause");
return 0;
}
4 总结
全部参考代码详见链接
大佬们,一起学习吧,如有不正确理解,希望大佬们指正。