1. 程式人生 > >LeetCode加一演算法(JS實現)

LeetCode加一演算法(JS實現)

給定一個由整陣列成的非空陣列所表示的非負整數,在該數的基礎上加一。

最高位數字存放在陣列的首位, 陣列中每個元素只儲存一個數字。

你可以假設除了整數 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)