【Leetcode66 -加一 Plus One】 (C語言)
阿新 • • 發佈:2019-01-25
目錄
加一Plus One
給定一個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。
最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3] 輸出: [1,2,4] 解釋: 輸入陣列表示數字 123。
示例 2:
輸入: [4,3,2,1] 輸出: [4,3,2,2] 解釋: 輸入陣列表示數字 4321。
測試單元
養成良好習慣,寫測試單元(分析會出現的幾種的情況)
1.輸入:[1,2,3] 輸出:[1,2,4]
2.輸入:[1,2,9] 輸出:[1,3,0]
3.輸入:[9,9,9] 輸出:[1,0,0,0]
由於返回後的陣列每個測試用例都要列印,所以就把列印封裝成一個函式,呼叫就好了,縮少程式碼量。
程式碼如下:
void arryprint(int *arry, int* size)//列印函式 { for (int i = 0; i < (*size); i++) { printf("%d ", arry[i]); } printf("\n"); } int main() { int arry1[] = { 1, 2, 4 }; int arry2[] = { 1, 2, 9 }; int arry3[] = { 9, 9, 9 }; int *size1 = (int *)malloc(sizeof(int)); int*rn1 = plusOne(arry1, 3, size1); arryprint(rn1, size1); int *size2 = (int *)malloc(sizeof(int)); int*rn2 = plusOne(arry2, 3, size2); arryprint(rn2, size1); int *size3 = (int *)malloc(sizeof(int)); int*rn3 = plusOne(arry3, 3, size3); arryprint(rn3, size3); system("pause"); return 0; }
題目分析
題目說要將輸入的陣列表示的數加一,所以我們就考慮一個數字加一有那幾種不同的情況。
1.不進位eg: [1,2,3]
2.進位
a.全進位eg:[9,9,9]、[9,9,9,9]
b.不全進位eg:[1,2,9]、[1,9,9]
發現不進位就只需要將陣列的最後一位值加一即可,而進位則與9有關,遇到9就進位,然後就是一系列的連鎖反應。則就用9作為篩選條件,將輸入劃分為進位與不進位。然後分開解決問題。
進位:考慮不需要擴大陣列長度的進位(1,2,9),和要擴大陣列長度的進位(9,9,9)
(1)思路清晰版
int* plusOne(int* digits, int digitsSize, int* returnSize) { //clock_t start = 0; //clock_t finish = 0; //計算程式執行的時間的函式 //double duration; int* result = (int*)malloc(sizeof(int)*(digitsSize + 1)); int i; for (i = 0; i < digitsSize; i++)//判斷是否進位 { if (digits[i] != 9) break; } if (i == digitsSize)//判斷是否要加長輸出陣列長度(輸入陣列全為9) { *returnSize = digitsSize + 1; result[0] = 1; for (int i = 1; i<digitsSize + 1; i++) result[i] = 0; return result; } i = digitsSize - 1; result[i] = digits[i] + 1; for (i; i>0; i--) { if (result[i] == 10)//判斷不是第一位為9的進位 { result[i] = 0; result[i - 1] = digits[i - 1] + 1; } else result[i - 1] = digits[i - 1]; } *returnSize = digitsSize; //finish = clock(); //duration = (double)(finish - start) / CLOCKS_PER_SEC; //printf("%f \n", duration); return result; }
(2)靈機一動版本
假如不是要增加陣列長度的分為一類,要增加陣列長度的分為一類(9,9,9)
從最後一位開始進位只要這一位是9就將這一位變為0,然後繼續向前遍歷(倒數第二位),假如這位不是9則這一位就加一跳出迴圈,拷貝到malloc動態開闢的陣列中去。(函式執行結束後,輸出的陣列不會被銷燬)->函式棧幀
如果是繼續進變為0,再遍歷下一位。直到遍歷結束,假如結束後第一位是0則增加一位為1,其餘全是0。增長陣列長長度。
程式碼如下:
int* plusOne(int* digits, int digitsSize, int* returnSize)
{
//clock_t start = 0;//計算程式執行時間
//clock_t finish = 0;
//double duration;
int i;
int* ren = (int*)malloc((digitsSize + 1)*sizeof(int));
for (i = digitsSize - 1; i >= 0; i--)
{
if (digits[i] < 9) //判斷進位
{
digits[i] = digits[i] + 1;
break;
}
else //進位
{
digits[i] = 0;
}
}
if (digits[0] == 0) //增加陣列長度
{
int j;
for (j = i; j < digitsSize + 1; j++)
{
ren[j] = 0;
}
ren[0] = 1;
*returnSize = digitsSize + 1;
//finish = clock();
//duration = (double)(finish - start) / CLOCKS_PER_SEC;
//printf("%f \n", duration);
return ren;
}
else //不增加陣列長度
{
for (int i = 0; i < digitsSize; i++) //拷貝
{
ren[i] = digits[i];
}
*returnSize = digitsSize;
//finish = clock();
//duration = (double)(finish - start) / CLOCKS_PER_SEC;
//printf("%f \n", duration);//計算程式執行時間
return ren;
}
}