算法学习记录(六十八)

127 阅读1分钟

问:

  1. 剑指 Offer 43. 1~n 整数中 1 出现的次数
  2. 剑指 Offer 49. 丑数
  3. 剑指 Offer 56 - II. 数组中数字出现的次数 II
  4. 剑指 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
};