题目
整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。
例如,对于 num = 1321 ,数组形式是 [1,3,2,1] 。
给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k 的 数组形式 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/add-to-array-form-of-integer
思路
1.核心步骤
1.1计算出数组的长度,创建一个新的数组来存放数据
int ksize = 0;
int knum = k;
while (knum)
{
ksize++;
knum /= 10;
}
int len = ksize > numSize ? ksize : numSize;
int* retarr = (int*)malloc((len + 1) * sizeof(int));
1.2将数组里面的数据一个个存放到新数组中
int newsize = 0;
int nextnum = 0;//如果个位、十位、或者其它位大于10 则记录下进的1
while (len--)
{
int a = 0;
if ((numSize - 1) >= 0)
{
a = num[numSize - 1];
numSize--;
}
int sum = a + k % 10 + nextnum;//计算每一位的大小
k /= 10;
if (sum >= 10)//每一位大于10,进1减10
{
nextnum = 1;//进位置成1
sum -= 10;
}
else//每一位小于10进位置成0
{
nextnum = 0;
}
retarr[newsize] = sum;//向新数组中存放数据
newsize++;
}
if (nextnum == 1)//当上面循环结束时如果nextnum不等于0则说明还有进位的1还没放
{
retarr[newsize] = 1;
newsize++;
}
2.循环停止的条件
当要存放的数组和k相加之后的值,全放进新数组的时候说明循环就停止了
while (len--)
3.细节方面的思考
3.1数组为什么要申请len+1个整形空间
因为数组的大小可能和k的大小一样,当循环结束时数组的最后一个数和k的最后一个数相加时可能发生进位,则nextnum=1。如果不多创建一个空间数组的将会少存一个数据。
所以要创建len+1个整形空间,否则会发生越界访问。
3.2数组是否已近正确了
我们仔细的思考之后可能会发现数组是反的与要求的结果不一样所以我们要将新数组反过来
int left = 0;
int right = newsize - 1;
while (left < right)
{
int temp = retarr[left];
retarr[left] = retarr[right];
retarr[right] = temp;
left++;
right--;
}
3.3nextnum是什么,有什么用
因为nextnum是计录当k的某一位和数组的其中一个相加时可能会超过10,产生进位
所以我们要把它减去10,然后记录下产生的进位也就是把nextnum置为1
当没产生进位的时候把nextnum置为0
完整版代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* addToArrayForm(int* num, int numSize, int k, int* returnSize)
{
int ksize = 0;
int knum = k;
while (knum)
{
ksize++;
knum /= 10;
}
int len = ksize > numSize ? ksize : numSize;
int* retarr = (int*)malloc((len + 1) * sizeof(int));
int newsize = 0;
int nextnum = 0;
while (len--)
{
int a = 0;
if ((numSize - 1) >= 0)
{
a = num[numSize - 1];
numSize--;
}
int sum = a + k % 10 + nextnum;
k /= 10;
if (sum >= 10)
{
nextnum = 1;
sum -= 10;
}
else
{
nextnum = 0;
}
retarr[newsize] = sum;
newsize++;
}
if (nextnum == 1)
{
retarr[newsize] = 1;
newsize++;
}
int left = 0;
int right = newsize - 1;
while (left < right)
{
int temp = retarr[left];
retarr[left] = retarr[right];
retarr[right] = temp;
left++;
right--;
}
*returnSize = newsize;
return retarr;
}