加一(leet簡單篇六十六題)
阿新 • • 發佈:2018-12-01
給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。
最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。
你可以假設除了整數 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;
}```