Open tsungtingdu opened 4 years ago
直覺排列組合解 分兩部分 先判斷小於目標位數的排列組合 在判斷等於目標位數的排列組合 在第二部分有點卡住,參考了T4寫的check作法
var atMostNGivenDigitSet = function(digits, n) {
let len = digits.length
let res = 0
let digit = 1
let targetDigit = String(n).length
while (digit < targetDigit) {
res += Math.pow(len, digit)
digit++
}
for (let i = 0; i < targetDigit; i++) {
let check = false
for (let j = 0; j < len; j++) {
if (digits[j] < String(n)[i]) {
res += Math.pow(len, targetDigit - (i + 1))
} else if (digits[j] === String(n)[i]) {
check = true
break
}
}
if (!check) return res
}
return res + 1
};
參考解,分成三部份處理
var atMostNGivenDigitSet = function(digits, n) {
n = String(n)
const len = n.length
let result = 0
countNumsLessDigitThanN()
countNumsSameDigitAsN()
return result
// 第一部分
function countNumsLessDigitThanN() {
for (let i = 1; i < len; i++) {
result += Math.pow(digits.length, i)
}
}
// 第二部分
function countNumsSameDigitAsN() {
for (let i = 0; i < len; i++) {
const properDigits = digits.filter(num => num < n[i])
result += properDigits.length * Math.pow(digits.length, len - i - 1)
// 第三部分
if (!digits.includes(n[i])) break
if (i === len - 1 ) result += 1
}
}
};
遞迴解,Time Limit Exceeded
DP 參考解