1. 程式人生 > >Java&LeetCode 初入門——066. 加一

Java&LeetCode 初入門——066. 加一

Java&LeetCode 初入門——066. 加一

文內程式碼全部採用JAVA語言。

題目

給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。

測試用例

示例 1:

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

示例 2:

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

個人解法

這個題目看得我懵逼。加1就加1,還要把好好地數字寫成陣列,真是氣死人,增加無謂的負擔。像我這麼頭腦簡單的小白,最開始的想法就是:直接把陣列轉成數字再+1,最後在再轉回來。事實證明,我還是too young too 天真。提交時直接給我來了個巨巨巨長的陣列,直接超出long的範圍,不得已放棄。

遂採用進位檢查的辦法,在最末位+1,檢查該位置是否有進位,並高位依次檢查是否有進位,如果溢位,如999 +1,已經超出原有陣列長度,只能寫新陣列重新安放資料。(如果有哪位仁兄知道有什麼內建方法可以在陣列最前面插入數字,麻煩留言告知)。

思路反正很簡單,在最低位+1,如果不需要進位,直接返回陣列;需要進位就依次檢查進位情況。最高位溢位就重新安放資料後返回,沒有溢位直接返回。
執行用時: 1 ms, 在Plus One的Java提交中擊敗了49.61% 的使用者。emmm,我也不造說啥了,大家可能都只需要0ms。

class Solution {
    	public int[] plusOne(int[] digits) {
		int length=digits.length;
		digits[length-1]=digits[length-1]+1;
		if (digits[length-1]!=10) {
			return
digits; } for (int i1 = digits.length-1; i1>0; i1--) { if (digits[i1]==10 ) { digits[i1]=0; digits[i1-1]+=1; } } if (digits[0]==10) { int[]ans=new int[length+1]; ans[0]=1; ans[1]=0; for (int j = 2; j < digits.length; j++) { ans[j]=digits[j]; } return ans; } return digits; } }

個人覺得就三種情況,自己測試的話可以測試 以下幾個用例: {1},{9},{1,2},{1,9},{9,9}。如果這幾個沒問題的話,那應該就差不多了。

大神解法

依舊沒有官方解法,大神解法來代班。

思路

思路和個人解法相同,就是豎式加法的思路。寫法相當簡潔,學習一下。

演算法

非常巧妙,從最低位開始檢測,一旦不需要進位就直接跳出迴圈,如果需要進位再依次向高位檢查。如果最高位是9,並且有從低位來的進位,那麼說明後面每一位都有進位,每一位都是9,直接返回最高位為1,其餘位為0的陣列。

class Solution {
    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            if (digits[i] == 9) {
                if (i == 0) {
                    int[] result = new int[digits.length + 1];
                    result[0] = 1;
                    return result;
                }
                digits[i] = 0;
            } else {
                digits[i] += 1;
                break;
            }
        }
        return digits;
    }
}

執行用時: 0 ms, 在Plus One的Java提交中擊敗了100% 的使用者。
這個應該是最佳解法了。