剑指Offer面试题43(Java版):n个骰子的点数
题目:把n个骰子仍在地上。全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率。
解法一:基于递归求骰子的点数,时间效率不够高
如今我们考虑怎样统计每个点数出现的次数。
要向求出n个骰子的点数和。能够先把n个骰子分为两堆:第一堆仅仅有一个。还有一个有n-1个。单独的那一个有可能出现从1到6的点数。
我们须要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和。
接下来把剩下的n-1个骰子还是分成两堆,第一堆仅仅有一个。第二堆有n-2个。
我们把上一轮哪个单独骰子的点数和这一轮单独骰子的点数相加。再和n-2个骰子来计算点数和。分析到这里,我们不难发现这是一种递归的思路。递归结束的条件就是最后仅仅剩下一个骰子。
解法二:基于循环求骰子的点数,时间性能好
能够换一个思路来解决问题,我们能够考虑用两个数组来存储骰子点数的每个综述出现的次数。在一次循环中。每个数组中的第n个数字表示骰子和为n出现的次数。
在下一轮循环中,我们加上一个新的骰子,此时和为n出现的次数。下一轮中,我们加上一个新的骰子,此时和为n的骰子出现的次数应该等于上一次循环中骰子点数和为n-1,n-2,n-3,n-4,n-5的次数之和,所以我们把还有一个数组的第n个数字设为前一个数组相应的第n-1。n-2。n-3,n-4,n-5
基于这个思路实现代码例如以下:
/**
* n个骰子的点数
*/
package swordForOffer; /**
* @author JInShuangQi
*
* 2015年8月11日
*/
public class E43DicsProbability {
/*
* 把n个骰子仍在地上,全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能出现的概率
*/
public void printProbability(int number) {
if (number < 1)
return;
int g_maxValue = 6;
int[][] probabilities = new int[2][];
probabilities[0] = new int[g_maxValue * number + 1];
probabilities[1] = new int[g_maxValue * number + 1];
int flag = 0;
for (int i = 1; i <= g_maxValue; i++)
probabilities[0][i] = 1;
for (int k = 2; k <= number; ++k) {
for (int i = 0; i < k; ++i)
probabilities[1 - flag][i] = 0;
for (int i = k; i <= g_maxValue * k; ++i) {
probabilities[1 - flag][i] = 0;
for (int j = 1; j <= i && j <= g_maxValue; ++j)
probabilities[1 - flag][i] += probabilities[flag][i - j];
}
flag = 1 - flag;
}
double total = Math.pow(g_maxValue, number);
for (int i = number; i <= g_maxValue * number; i++) {
double ratio = (double) probabilities[flag][i] / total;
System.out.println(i);
System.out.println(ratio);
}
}
}
剑指Offer面试题43(Java版):n个骰子的点数的更多相关文章
- 剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组.实现一个函数来调整该数组中数字的顺序.使得全部奇数位于数组的前半部分.全部偶数位于数组的后半部分. 1.基本实现: 假设不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...
- 剑指offer 面试题43. 1~n整数中1出现的次数
leetcode上也见过一样的题,当时不会做 看了一下解法是纯数学解法就没看,结果剑指offer上也出现了这道题,那还是认真看下吧 对于数字abcde,如果第一位是1,比如12345,即计算f(123 ...
- 剑指offer面试题43:n个筛子的点数
题目描述: 把n个筛子扔在地上,所有筛子朝上的一面点数之和为s,输入n,打印出s的所有可能的值出线的概率. 书上给了两种解法,第一种递归的方法由于代码太乱,没有看懂=.= 第二种方法很巧妙,lz已经根 ...
- 剑指Offer第36题—Java版
本题使用归并排序的思想,结合归并排序,写出的算法解. //数组中的逆序对 public static int InversePairs(int[] array){ if(array==null||ar ...
- 【剑指offer】(第 2 版)Java 题解
[剑指offer](第 2 版)Java 题解 第一章 面试的流程 略... 第二章 面试需要的基础知识 面试题 1. 赋值运算符函数 面试题 2. 实现 Singleton 模式 Solution ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
随机推荐
- select onchange事件的使用
<select name="expireDay" id="expireDay" class="form-control" onchan ...
- luogu P1519 穿越栅栏 Overfencing
题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...
- 将中文库导入到ARM板子中以解决中文显示乱码的教程
1.将中文字符集导入到ARM板子中的/usr/fonts/目录下 在这里我们使用的字符集为:DroidSansFallback.ttf 下载地址为:https://pan.baidu.com/s/1e ...
- Openjudge-2815-城堡问题
对于这道题目来说的话,我们的思路是这样的,我们首先把数据读进来,然后把color数组清零. 我们的思路是这样的的,给每一个房间设置一个对应的color数组,然后color数组里面填满不同的数字,每一种 ...
- spring踩坑
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is ...
- 12. KEY_COLUMN_USAGE
12. KEY_COLUMN_USAGE KEY_COLUMN_USAGE表描述哪些键列具有约束. KEY_COLUMN_USAGE表有以下列: CONSTRAINT_CATALOG :约束所属目录的 ...
- mysql 删除恢复
一.模拟误删除数据表的恢复 1 二进制日志功能启用 vim /etc/my.cnf [mysqld] log-bin 2 完全备份 mysqldump -A -F --master-data=2 - ...
- 【ORACLE】查看死锁进程并结束死锁的脚本
--共享锁:Share:排他锁:Exclusive:行共享锁:Row-S:行排他锁:Row-X select V$SESSION.sid,v$session.SERIAL#,v$process.spi ...
- 【06】sass编译工具(弃)
[06]编译工具(弃) SASS转译工具 除了使用sass命令来转译SASS文件之外,还可以借助第三方工具完成,目前世面上较为流行的转译工具主要有: Compass.app Scout Codekit ...
- 使用inline-box代替float
在网页布局中,使用float有不少好处,可以为你带来更加自由的布局,还可以自动根据浏览器改变布局效果.但是使用多了你也可能发现有一个问题,使用了float之后,外层的div不会撑高,导致布局出现坍塌. ...