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("")
};