1. 程式人生 > >【Leetcode66 -加一 Plus One】 (C語言)

【Leetcode66 -加一 Plus One】 (C語言)

目錄

測試單元

題目分析

大功告成

加一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;
	}
}

大功告成