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% 的使用者。
這個應該是最佳解法了。