1. 程式人生 > >加一(leet簡單篇六十六題)

加一(leet簡單篇六十六題)

給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。

最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。

你可以假設除了整數 0 之外,這個整數不會以零開頭。

示例 1:

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123。

示例 2:

輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入陣列表示數字 4321

	int* plusOne(int* digits, int digitsSize, int* returnSize) { 
	int *r = (int
*)malloc(sizeof(int)*(digitsSize + 1)); //加一是為了防止進位溢位 *returnSize = digitsSize; //假設沒有最高位進位,則返回結果的長度與原陣列相同 r[0] = 0; //多分配了一位記憶體,先佔位 int count = digitsSize; //計數 int temp; //進位變數 if (digitsSize == 1) //如果原陣列只有一個值,單獨處理 { if (digits[0] == 9) //一位還會產生進位,直接賦值,並將*returnSize + 1
{ r[0] = 1; r[1] = 0; *returnSize += 1; } else //否則直接加一,程式結束 r[0] = digits[0] + 1; } else //有多位,模仿豎式計算 { for (int i = digitsSize - 1; i >= 0; i--) //從陣列下標的高位開始處理,實際是處理數字的低位 { if (digits[i] + 1 == 10 && i == digitsSize - 1) //先看數字最低位是否產生進位,產生進位,則結果最低位為0 {
r[count - 1] = 0; temp = 1; //temp記1代表下一位增 1 } else if (digits[i] + 1 != 10 && i == digitsSize - 1) //最低位沒進位,直接加 1 { r[count - 1] = digits[i] + 1; temp = 0; } else if (digits[i] + temp == 10) //看除最低位是否產生進位 { r[count - 1] = 0; temp = 1; } else { r[count - 1] = digits[i] + temp; temp = 0; } count--; //往高位移動 } if (digits[0] == 9 && (digits[1] + temp) == 10) //在這種情況下,會在最高位產生一個進位 { r[0] = 1; *returnSize += 1; } if (r[0] == 0) //沒有產生額外進位,處理掉多佔的一位,並縮短結果陣列的長度 { *returnSize -= 1; for (int i = 0; i<*returnSize - 1; i++) r[i] = r[i + 1]; } } return r; }```