You are given a large integer represented as an integer array digits, where each digits[i] is the ith digit of the integer. The digits are ordered from most significant to least significant in left-to-right order. The large integer does not contain any leading 0’s.
Increment the large integer by one and return the resulting array of digits.
給予一個陣列組叫做「digits」,裏面的每個元素都是整數,且陣列中的數值由高到低排序,且起始值不會有0。 將一個整數加入1,並回傳到「digits」陣列中。
Constraints:
確認digits中的數字範圍,以及陣列長度,重點是不會出現0開頭。
1 <= digits.length <= 100 0 <= digits[i] <= 9 digits does not contain any leading 0's.
Example 1:
Input: digits = [1,2,3] Output: [1,2,4] Incrementing by one gives 123 + 1 = 124.
Example 2:
Input: digits = [4,3,2,1] Output: [4,3,2,2] Incrementing by one gives 4321 + 1 = 4322.
Example 3:
Input: digits = [9] Output: [1,0] Incrementing by one gives 9 + 1 = 10.
Solution:
1. 先陣列中的數字取出,由字串轉成數值。
2. 將數值+1。
3. 再將數值+1轉成字串陣列。
(ex.注意當input的陣列大於2^53時,要使用BigInt(value),
因為JavaScript原生的Number能夠表示的最大值為2^53。)
Code 1:
var plusOne = function(digits) { if (digits.length > 11) { let digitsNum = BigInt(digits.join('')) digitsNum++ digitsString = String(digitsNum) return digitsString.split('') } let digitsNum = Number(digits.join('')) digitsNum++ digitsString = String(digitsNum) return digitsString.split('') };
FlowChart:
Example 1
digits = [1,2,3] digits.length = 3 < 11 //使用Number() Number(digits.join('')) = 123 //先轉字串合併在一起,再轉數值 Number.(digits)++ = 123 + 1 = 124 String(digitsNum) = '124' return digitsString.split('') = [1,2,4]
FlowChart:
Example 2
digits = [4,3,2,1] digits.length = 4 < 11 //使用Number() Number(digits.join('')) = 4321 //先轉字串合併在一起,再轉數值 Number.(digits)++ = 123 + 1 = 4322 String(digitsNum) = '4322' return digitsString.split('') = [4,3,2,2]
FlowChart:
Example 3
digits = [9] digits.length = 1 < 11 //使用Number() Number(digits.join('')) = 9 //先轉字串合併在一起,再轉數值 Number.(digits)++ = 9 + 1 = 10 String(digitsNum) = '10' return digitsString.split('') = [1,0]
Remark: 暴力解 => 直接判斷陣列最後一個數值,不是9就加1,是9就變成0,且使用.unshift(1)在陣列第一位推入1的數值。
Code 2:
var plusOne = function(digits) { for (let i = digits.length - 1; i >= 0; i--) { if (digits[i] !== 9) { digits[i]++ return digits } else { digits[i] = 0 } } digits.unshift(1) return digits };
Code 3:
var plusOne = function(digits) { return (String(BigInt(digits.join("")) + BigInt(1))).split("") };