帥小哥

文章 评论 浏览 28

帥小哥 2022-05-04 13:55:00
    // 转化为概率计算
    // 不考虑key=0
    // 分割n 实例 52312 => 50000,52000,52300,52310,52312
    // 计算 00000-49999 50000-51999 52000-52299 52300-52309 52310-52312   1 * 0.9 * (长度 - 1) ||  (首位 - 1) / 首位 * 0.9 * (长度 - 1)
    // k = 0时,第一项(00000-49999)计算结果不同  => 结果等同于 0-9999 取 0/1/2/3/4/5/6/7 的次数 执行 (5-1)次 => 结果等同于 1-9999 取 1的次数 执行 4次
    const getOneCount = (n, key) => {
        let length = (n + '').length;
        let arr = [];
        let i = 0;
        let count = 0;
        while (i < length) {
            let times = Math.pow(10, length - i - 1);
            let num = Math.floor(n / times);
            count += getKeyCount(num * times, i, key);
            i++;
            // 检测到 上一位是key 且不是最后一位
            if (num % 10 === key && i < length) {
                count += (n - num * times) + 1;
                break;
            }
        }
        return count;
    };
    // 不含 n 大于一位  0 ~ n-1
    function getKeyCount(n, i, k) {
        let arr = (n + '').split('').map(item => +item);
        let newArr = arr.slice(i);
        if (i === 0 && k === 0) {
            return arr[0] * getOneCount(+Array(arr.length - 1).fill('9').join(''), 1) - 1;
        }
        if (newArr.length > 1) {
            let count = +newArr.join('');
            let probability = (newArr[0] <= k ? 1 : (newArr[0] - 1) / newArr[0]) * Math.pow(0.9, newArr.length - 1);
            return Math.round((1 - probability) * count);
        }
        else {
            return newArr[0] >= k ? 1 : 0;
        }
    }
    console.log('copy-getOneCount(11, 1)');
    console.log(getOneCount(13, 2));
    console.log(getOneCount(16, 2));
    console.log(getOneCount(20, 0));
    console.log(getOneCount(26, 0));
    console.log(getOneCount(20, 1));
    console.log(getOneCount(40000000, 1));

第 121 题:统计 1 ~ n 整数中出现 1 的次数

帥小哥 2022-05-04 13:51:26

@yh284914425 非常好的问题!但这个问题涉及到的知识点,其实整个系列文章都没有讲到过,日后我一定补上。

具体原因可以参考汤姆大叔的文章,简单的说一说,是因为当解释器在代码执行阶段遇到命名的函数表达式时,会创建辅助的特定对象,然后将函数表达式的名称即 b 添加到特定对象上作为唯一的属性,因此函数内部才可以读取到 b,但是这个值是 DontDelete 以及 ReadOnly 的,所以对它的操作并不生效,所以打印的结果自然还是这个函数,而外部的 b 值也没有发生更改。

JavaScript 深入之执行上下文

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文