剑指 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;
};