1. 程式人生 > 其它 >leetcode--陣列形式的整數加法 ---C實現

leetcode--陣列形式的整數加法 ---C實現

題目描述:對於非負整數 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; }