LeetCode加一演算法(JS實現)
阿新 • • 發佈:2018-12-02
給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。
最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入陣列表示數字 123。
示例 2:
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入陣列表示數字 4321。
解題思路:
這道題我遇到的時候,我想到的第一個方法居然不是用演算法,而是採用將陣列轉換為字串,然後將字串轉換為數字然後進行加一操作。最後在反過來轉換為陣列
首先講這樣的方法是肯定正確的,而且思路很清晰,但是它脫離的演算法的根本,而且它有一個致命的缺點就是不能對包含很多元素的陣列進行操作,這樣會報錯,它只能對小陣列進行操作,那肯定是不符合題意的。隨後我就上網找了關於這題的答案,不過網上給出的解析很模糊。我大概看了一下把他們的想法給實現一下:
首先數字加一會產生二種情況:1 數字不會產生進位 2 數字會產生進位(這裡的進位是包含9999+1=10000) 首先將9999+1=10000這種特殊情況給特殊對待,下面是程式碼:
let index = 0; let arr = [] let len = digits.length for (i of digits) { if (i != 9) { break; } index++; } if (index == digits.length) { arr[0] = 1; for (let j = 0; j < digits.length; j++) { arr.push(0) } return arr; }
這裡陣列會產生增加一位,所以我新建一個數組,來滿足要求,第一種情況完成,這時候我們來分析第二種:這裡會有二種:1+2=3(只是舉個例子) 和9+1=10(這個是進位的唯一情況)前者問題很好解決,只是單純的在陣列該位置的元素加一就可以,這時候就可以直接結束迴圈 。9+1=10這種會進位 那麼原陣列的位置10就會變成0 也就是(array[i]%10) 而且array[i-1]會加一 這時候又會繼續剛才的判斷1+2=3或者9+1=10;也就是隻有遇到9+1的時候才會對陣列元素繼續遍歷,下面是程式碼:
else { let carry = 0; digits[len - 1] += 1; for (i = len - 1; i >= 0; i--) { digits[i] += carry; if (digits[i] >= 10) { carry = digits[i] / 10; digits[i] = digits[i] % 10; } else { break; } } return digits }
詳細程式碼JS實現
var plusOne = function(digits) {
let index = 0;
let arr = []
let len = digits.length
for (i of digits) {
if (i != 9) {
break;
}
index++;
}
if (index == digits.length) {
arr[0] = 1;
for (let j = 0; j < digits.length; j++) {
arr.push(0)
}
return arr;
} else {
let carry = 0;
digits[len - 1] += 1;
for (i = len - 1; i >= 0; i--) {
digits[i] += carry;
if (digits[i] >= 10) {
carry = digits[i] / 10;
digits[i] = digits[i] % 10;
} else {
break;
}
}
return digits
}
};
let arr = [2, 4, 9, 3, 9]
let a = plusOne(arr)
console.log(a)