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

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

  • 启示一:学会使用递归求解
  • 启示二:准确理解骰子数和前一个骰子数与和之间的关系,是解题关键
  • 启示三:学会运用哈希表
相关文章
|
2月前
|
存储 JSON JavaScript
「offer来了」保姆级巩固你的js知识体系(4.0w字)
该文章提供了JavaScript知识体系的全面复习资料,覆盖了从基础语法到高级特性如闭包、原型链、异步编程等多个方面,并通过大量的面试题和实例代码帮助巩固理解。
「offer来了」保姆级巩固你的js知识体系(4.0w字)
|
6月前
|
JavaScript 前端开发
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
剑指 Offer 31. 栈的压入、弹出序列 (javascript实现)
|
6月前
|
JavaScript 前端开发
JavaScript题解剑指offer : 09. 用两个栈实现队列
JavaScript题解剑指offer : 09. 用两个栈实现队列
42 0
|
JavaScript 前端开发 程序员
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
《剑指 Offer(第 2 版)》树部分JavaScript题解
|
存储 JavaScript 前端开发
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
《剑指 Offer (第 2 版)》链表部分 JavaScript 题解
|
JavaScript 算法 前端开发
【前端算法】JS实现数字千分位格式化
JS实现数字千分位格式化的几种思路,以及它们之间的性能比较
342 1
|
存储 前端开发 算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
162 0
一行代码解决LeetCode实现 strStr()使用JavaScript解题|前端学算法
|
存储 机器学习/深度学习 JavaScript
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
JS 你最少用几行代码实现深拷贝?
|
JavaScript 前端开发 算法
JavaScript实现一段时间之后关闭广告
简介:通过JavaScript实现在一段时间之后,广告消失。
130 0
JavaScript实现一段时间之后关闭广告
|
JavaScript 前端开发 算法
JS实现鼠标悬停变色
本文实现的是利用JS实现当鼠标悬停在表格上的时候,表格发生变色。 CSS渲染 JS逻辑 `
219 0
JS实现鼠标悬停变色