剑指Offer——n个骰子的点数(JS实现)

简介: 剑指Offer——n个骰子的点数(JS实现)

题目描述

image.png

解题思路

  • 本题可以通过递归的形式进行解决,也可以采用动态规划
  • 核心就在于理解题意,找到骰子数和这些骰子数和的关系

核心公式(这个不好解释,关键在于理解代码)

n个骰子的所有结果的总数=(这个骰子是1−6)+(n−1)个骰子是(和−(1−6))的所有结果的和n个骰子的所有结果的总数 = (这个骰子是1 - 6) + (n-1)个骰子是(和-(1-6))的所有结果的和n=16+(n1)16

解题代码

var dicesProbability = function (n) {
    // n个骰子的点数之和的范围是[n,6n]
    // 返回的最终结果数组的分母是6的n次方
    const total = Math.pow(6, n);
    const result = [];
    // 创建一个哈希表,用来存储第n个骰子前一个骰子 目标和 的总数
    const m = new Map();
    for (let i = n; i <= 6 * n; i++) {
        // 下面的s指的是
        const denominator = helper(i, n);
        // 将每一个结果分别加到最终的结果中
        result.push(denominator / total);
    }
    function helper(count, n) {
        // 首先判断哈希表中是否有记录 n-1 个骰子目标和的总数
        let key = `和:${count}-骰子数:${n}`;
        if (m.has(key)) {
            return m.get(key);
        }
        if (count < n || count > 6*n) {
            return 0;
        }
        if (n === 1) {
            return 1;
        }
        let res = 0;
        // 递归求解:求目标骰子数指定和的可能值的数量,就是求目标骰子数-1,当前和减去1-6的所有的可能性 然后进行求和
        for (let i = 1; i <= 6; i++) {
            res = res + helper(count - i,n-1,m);
        }
        m.set(key,res);
        return res;
    }
    return result;
};

总结(本题给我们的启示思路)

  • 启示一:学会使用递归求解
  • 启示二:准确理解骰子数和前一个骰子数与和之间的关系,是解题关键
  • 启示三:学会运用哈希表
相关文章
|
4月前
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
24 0
|
存储 JavaScript 前端开发
《剑指 Offer(第 2 版)》队列部分 JavaScript 题解
《剑指 Offer(第 2 版)》队列部分 JavaScript 题解
|
JavaScript 前端开发 程序员
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
|
存储 JavaScript 前端开发
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
|
JavaScript 前端开发
利用JavaScript实现二级联动
利用JavaScript实现二级联动 要实现JavaScript二级联动效果,首先要确定需要哪些技术: 二维数组 for in循环 new Option(text,value,true,true) add(option,null) onchange() 表单事件 HTML代码: &lt;!-- &lt;input type=&quot;text&quot; id=&quot;text&quot;&gt; --&gt; 请选择省份: &lt;select name=&quot;&quot; id=&quot;provinces&quot;&gt; &lt;!-- &lt;option value=&quot;江苏省&quot;&gt;江苏省&lt;/option&gt;
|
JavaScript 前端开发
JavaScript函数柯里化的实现原理,进来教你完成一个自己的自动实现柯里化方法
JavaScript函数柯里化的实现原理,进来教你完成一个自己的自动实现柯里化方法
167 0
|
移动开发 JavaScript weex
weex-自定义module,实现weex在iOS的本地化,js之间互相跳转,交互,传值(iOS接入weex的最佳方式)
weex-自定义module,实现weex在iOS的本地化,js之间互相跳转,交互,传值(iOS接入weex的最佳方式)
219 0
|
JavaScript
JS中实现或退出全屏
JS中实现或退出全屏
153 0
|
前端开发 JavaScript
前端:JS实现双击table单元格变为可编辑状态
前端:JS实现双击table单元格变为可编辑状态
365 0