2021-08-17:谷歌面试题扩展版,面值为1~N的牌组成一组,每次你从组里等概率的抽出1~N中的一张,下次抽会换一个新的组,有无限组,当累加和<a时,你将一直抽牌,当累加和>=a且<b时,你将获胜
2021-08-17:谷歌面试题扩展版,面值为1N的牌组成一组,每次你从组里等概率的抽出1N中的一张,下次抽会换一个新的组,有无限组,当累加和<a时,你将一直抽牌,当累加和>=a且<b时,你将获胜,当累加和>=b时,你将失败。返回获胜的概率,给定的参数为N,a,b。
福大大 答案2021-08-17:
递归。一张牌一张牌累加,概率累加即可。
时间复杂度:O(N*b)。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
ret := f2(5, 2, 3)
fmt.Println(ret)
}
func f1() float64 {
return p1(0)
}
// 游戏的规则,如上
// 当你来到cur这个累加和的时候,获胜概率是多少返回!
func p1(cur int) float64 {
if cur >= 17 && cur < 21 {
return 1.0
}
if cur >= 21 {
return 0.0
}
w := 0.0
for i := 1; i <= 10; i++ {
w += p1(cur + i)
}
return w / 10
}
// 谷歌面试题扩展版
// 面值为1~N的牌组成一组,
// 每次你从组里等概率的抽出1~N中的一张
// 下次抽会换一个新的组,有无限组
// 当累加和<a时,你将一直抽牌
// 当累加和>=a且<b时,你将获胜
// 当累加和>=b时,你将失败
// 返回获胜的概率,给定的参数为N,a,b
func f2(N int, a int, b int) float64 {
if N < 1 || a >= b || a < 0 || b < 0 {
return 0.0
}
if b-a >= N {
return 1.0
}
// 所有参数都合法,并且b-a < N
return p2(0, N, a, b)
}
// 游戏规则,如上,int N, int a, int b,固定参数!
// cur,目前到达了cur的累加和
// 返回赢的概率
func p2(cur int, N int, a int, b int) float64 {
if cur >= a && cur < b {
return 1.0
}
if cur >= b {
return 0.0
}
w := 0.0
for i := 1; i <= N; i++ {
w += p2(cur+i, N, a, b)
}
return float64(w) / float64(N)
}
// f2的改进版本,用到了观察位置优化枚举的技巧
// 可以课上讲一下
func f3(N int, a int, b int) float64 {
if N < 1 || a >= b || a < 0 || b < 0 {
return 0.0
}
if b-a >= N {
return 1.0
}
return p3(0, N, a, b)
}
func p3(cur int, N int, a int, b int) float64 {
if cur >= a && cur < b {
return 1.0
}
if cur >= b {
return 0.0
}
if cur == a-1 {
return 1.0 * float64(b-a) / float64(N)
}
w := p3(cur+1, N, a, b) + p3(cur+1, N, a, b)*float64(N)
if cur+1+N < b {
w -= p3(cur+1+N, N, a, b)
}
return float64(w) / float64(N)
}
// f3的改进版本的动态规划
// 可以课上讲一下
func f4(N int, a int, b int) float64 {
if N < 1 || a >= b || a < 0 || b < 0 {
return 0.0
}
if b-a >= N {
return 1.0
}
dp := make([]float64, b)
for i := a; i < b; i++ {
dp[i] = 1.0
}
if a-1 >= 0 {
dp[a-1] = 1.0 * float64(b-a) / float64(N)
}
for cur := a - 2; cur >= 0; cur-- {
w := dp[cur+1] + dp[cur+1]*float64(N)
if cur+1+N < b {
w -= dp[cur+1+N]
}
dp[cur] = float64(w) / float64(N)
}
return dp[0]
}
执行结果如下:

2021-08-17:谷歌面试题扩展版,面值为1~N的牌组成一组,每次你从组里等概率的抽出1~N中的一张,下次抽会换一个新的组,有无限组,当累加和<a时,你将一直抽牌,当累加和>=a且<b时,你将获胜的更多相关文章
- AMD系统中,virtualbox 不能为虚拟电脑打开一个新任务
我的电脑装的Genymotion,之前开发Andriod4.4版本的时候在Genymotion上都可以运行,可是开发Andriod5.0+的时候,Genymotion就不能运行了,究其原因,原来是Vi ...
- sql语句联表更新(从一个数据库中的一张表更新到另一个数据库的另一张表)
一.sql server数据库写法: update a set a.ksgmm=b.ksgmm,a.ksgm=b.ksgm,a.scztm=b.scztm,a.sczt=b.sczt from lan ...
- SQL数据库,如何把服务器中的一张表插入到另外一个服务器的一张表中
先开启 exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Qu ...
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展
将一个对象相同的属性(不区分大小写)赋值给一个新对象 1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...
- RocketMQ一个新的消费组初次启动时从何处开始消费呢?
目录 1.抛出问题 1.1 环境准备 1.2 消息发送者代码 1.3 消费端验证代码 2.探究CONSUME_FROM_MAX_OFFSET实现原理 2.1 CONSUME_FROM_LAST_OFF ...
- Kubernetes——自动扩展容器!假设你突然需要增加你的应用;你只需要告诉deployment一个新的 pod 副本总数即可
参考:http://kubernetes.kansea.com/docs/hellonode/ 现在你应该可以通过这个地址来访问这个service: http://EXTERNAL_IP:8080 或 ...
- 剑指offer面试题-Java版-持续更新
最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...
- 分析Linux内核创建一个新进程的过程【转】
转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用 ...
- php数组根据某一个键值,把相同键值的合并生成一个新的二维数组
http://blog.csdn.net/xyzchenxiaolin/article/details/51700485 源数据: $infos = array( array( 'a' => 3 ...
- VirtualBox不能为虚拟电脑打开一个新任务——The VirtualBox kernel modules do not match this version of VirtualBox
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=608 一.问题产生的环境 物理机操作系统:Ubuntu 17.10 (Ubuntu版本查看命令: cat /etc/ ...
随机推荐
- c++方便的输出vector和map_重载的应用 【python一样写c++、二】
写程序,尤其是调试的时候,会想着直接输出一个map或者vector来调错. 但本来的cout<<没有这种功能.我们就会想了,要是c++能和python一样,直接输出一个列表(vector) ...
- Java(单元测试,反射)
单元测试.反射 一.单元测试 1.1 单元测试快速入门 所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试. 我们想想,咱们之前是怎么进行测试的呢? 比如说我们写了一个学生管理系统, ...
- Java笔记第十三弹
函数式接口 有且仅有一个抽象方法的接口 适用于Lambda使用的接口 @FunctionalInterface//表示函数式接口 函数式接口作为方法的参数 public class Main{ pub ...
- CF916E 解题报告
被这道题搞了一个晚上,还好搞出来了qwq 令人耳目一新的阅读体验 题目简述 翻译已经很简单了. 前置知识 DFS序,LCA,线段树,不需要标签中的树剖! DFS序更新信息及判断祖先 如果你还不知道DF ...
- (数据科学学习手札150)基于dask对geopandas进行并行加速
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为我们非常 ...
- java数组排序及查找方法
前言 在上一篇文章中,壹哥给大家讲解了数组的扩容.缩容及拷贝方式.接下来在今天的文章中,会给大家讲解更重要的数组排序及查找方法.今天的内容会有点难,希望你不要因此而退缩,挺过这一关,你会向上突破的! ...
- CentOS7-自动化部署web集群
一.项目要求 1.创建role,通过role完成项目(可能需要多个role) 2.部署nginx调度器(node2主机) 3.部署2台lnmp服务器(node3,node4主机) 4.部署mariad ...
- 记某gov门户网站渗透测试(已修复)
前言: 免责声明:涉及到的所有技术仅用来学习交流,严禁用于非法用途,未经授权请勿非法渗透.否则产生的一切后果自行承担! 该渗透测试项目为已授权项目,本文已对敏感部分做了相关处理. 正文: SQL注入( ...
- 使用kubeadm快速启用一个集群
使用kubeadm快速启用一个集群 CentOS 配置YUM源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] n ...
- kubernetes核心实战(二)---Pod+ReplicaSet
3.pod Pod 是可以在 Kubernetes 中创建和管理的.最小的可部署的计算单元. Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器:这些容器共享存储.网络.以及怎样运行这些容 ...