剑指offer 2.28

39 阅读1分钟

剑指 Offer 43. 1~n 整数中 1 出现的次数

// 类似密码锁,注意digit,要补上被除的10给低位。
var countDigitOne = function(n) {
    let res = 0;
    let low = 0;
    let high = Math.floor(n/10);
    let mid = n%10;
    let digit = 1;
    while(high||mid){
        if(mid==0){// 中间数为0时,此位为1的数就是高位数的数量。
            res += high*digit;
        }
        else if(mid==1){// 中间数为1时,此位为1的数就是高位数加上低位数的数量。
            res += high*digit+low+1;
        }
        else{// 中间数大于1时,此位位1的数就是高位数的个位数加一的数量。
            res += (high+1)*digit;
        }
        low += mid*digit;
        mid = high%10;
        high = Math.floor(high/10);
        digit *= 10;
    }
    return res;
};

剑指 Offer 60. n个骰子的点数

// 其实给tmp设为Array(5*i+1).fill(0)更简单,后面都不需要判断了,但是我叛逆。
var dicesProbability = function (n) {
    let res = [1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6, 1 / 6];
    for (let i = 2; i <= n; i++){
        // let tmp = new Array(5*i+1).fill(0);
        let tmp = [];
        for(let j=0;j<6;j++){
            for(let k=0;k<res.length;k++){
                if(j==0){
                   tmp.push(res[k]*1/6); 
                   // 注意这个地方是res[k]不是res[0],后面的res会变化所以跟着下标乘
                   continue;
                }
                if(k==res.length-1){
                    tmp.push(res[res.length-1]*1/6);
                    continue;
                }
                tmp[k+j] += res[k]*1/6;
            }
        }
        res = tmp;
    }
    return res;
};