leetcode--陣列形式的整數加法 ---C實現
阿新 • • 發佈:2020-12-22
題目描述:對於非負整數 X 而言,X 的陣列形式是每位數字按從左到右的順序形成的陣列。例如,如果 X = 1231,那麼其陣列形式為 [1,2,3,1]。
給定非負整數 X 的陣列形式 A,返回整數 X+K 的陣列形式。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/add-to-array-form-of-integer
示例
輸入:A = [1,2,0,0], K = 34
輸出:[1,2,3,4]
解釋:1200 + 34 = 1234
思路:
將 K 的每一位分解出來,與陣列A內的元素按下標相加,若相加結果> 9,則向下一位進1。將結果陣列形式輸出的時候應注意,輸出的只是目標陣列的逆序。過程如下圖所示。
示例 3:這是一個需要進位的例子
輸入:A = [2,1,5], K = 806
輸出:[1,0,2,1]
解釋:215 + 806 = 1021
此時的結果陣列長度增加,在寫程式碼的時候需要注意。
具體程式碼實現如下
#include<stdio.h>
#include<stdlib.h>
int* addToArrayForm(int* A, int ASize, int K, int* returnSize)
{
int kSize = 0;
int kNum = K;
while (kNum)//計算出K的長度
{
++kSize;
kNum /= 10 ;
}
int len = ASize > kSize ? ASize : kSize;//判斷A和K的大小,以大的為基準
int*retArr = (int*)malloc(sizeof(int)*(len + 1));//申請空間
//思想:A和K 按位相加 大於9,向前一位進1
int Ai = ASize - 1;//由最後一位開始相加
int reti = 0;//相加後得到的陣列的下標
int nextNum = 0;//進位
while (len--)
{
int a = 0;
if (Ai >= 0)//取出陣列A的每一位元素
{
a = A[Ai];
Ai-- ;//取出一位後,下標減一
}
int ret = a + K % 10 + nextNum;//相加後得到的陣列的元素的值
K /= 10;//將K的最後一位分離出來
if (ret >9)
{
ret -= 10;//大於9,進位之後留下的值為 ret-10
nextNum = 1;
}
else
{
nextNum = 0;
}
retArr[reti] = ret;//對陣列的每一位進行賦值
++reti;//兩個陣列每按位相加一次,陣列下標加1
}
//如果遇到 1999 + 9000 這種需要增加一位的情況
if (nextNum == 1)
{
retArr[reti] = 1;//增加的一位最大為1
++reti;
}
int left = 0, right = reti - 1;
while (left <right)//陣列的逆置
{
int tmp = retArr[left];
retArr[left] = retArr[right];
retArr[right] = tmp;
++left;
--right;
}
*returnSize = reti;
return retArr;
}
int main()
{
int A[] = { 1, 2, 0, 0 };
int ASize = sizeof(A) / sizeof(A[0]);
int K = 34;
int returnSize = 0;
int* retArr = addToArrayForm(A, ASize, K, &returnSize);
int i = 0;
for (i = 0; i < returnSize; i++)
{
printf("%d ", retArr[i]);
}
return 0;
}