问:
- 剑指 Offer 43. 1~n 整数中 1 出现的次数
- 剑指 Offer 49. 丑数
- 剑指 Offer 56 - II. 数组中数字出现的次数 II
- 剑指 Offer 67. 把字符串转换成整数 解:
const countDigitOne = function(n) {
let base = 1
let left = 0
let right = 0
let cur = 0
let total = 0
while (base <= n) {
left = ~~(n / base / 10)
right = n % base
cur = ~~((n / base)) % 10
if (cur > 1) {
total += (left + 1) * base
} else if (cur === 1) {
total += left * base + right + 1
} else {
total += left * base
}
base *= 10
}
return total
};
const nthUglyNumber = function(n) {
const dp = []
dp[0] = 1
let three = 0
let two = 0
let five = 0
for (let i = 1; i < n; i++) {
dp[i] = Math.min(dp[two] * 2, dp[three] * 3, dp[five] * 5)
if (dp[i] === dp[two] * 2) two++
if (dp[i] === dp[three] * 3) three++
if (dp[i] === dp[five] * 5) five++
}
return dp[n - 1]
};
const singleNumber = function(nums) {
let res = 0
let tag = 0
let sum = 0
for (let i = 0; i < 32; i++) {
tag = 1 << i
sum = 0
for (let num of nums) {
if ((num & tag) !== 0) sum++
}
sum %= 3
res += (sum << i)
}
return res
};
const strToInt = function(str) {
const hashMap = new Map(
[
['start', ['start', 'sign', 'number', 'end']],
['sign', ['end', 'end', 'number', 'end']],
['number', ['end', 'end', 'number', 'end']],
['end', ['end', 'end', 'end', 'end']]
]
)
let state = 'start'
let res = 0
let sign = 1
const numsArr = []
for (let i = 0; i < 10; i++) {
numsArr.push(''+i)
}
for (let i of str) {
if (i === ' ') {
state = hashMap.get(state)[0]
} else if (i === '+' || i === '-') {
state = hashMap.get(state)[1]
} else if (numsArr.includes(i)) {
state = hashMap.get(state)[2]
} else {
state = 'end'
}
if (state === 'number') {
res = sign === 1 ? Math.min(res * 10 + +i, Math.pow(2, 31) - 1) : Math.min(res * 10 + +i, -Math.pow(-2, 31));
} else if (state === 'sign') {
sign = i === '+' ? 1 : 0
} else if (state === 'end') {
return sign ? res : -res
}
}
return sign ? res : -res
};