2021-08-17:谷歌面试题扩展版,面值为1N的牌组成一组,每次你从组里等概率的抽出1N中的一张,下次抽会换一个新的组,有无限组,当累加和<a时,你将一直抽牌,当累加和>=a且<b时,你将获胜,当累加和>=b时,你将失败。返回获胜的概率,给定的参数为N,a,b。

福大大 答案2021-08-17:

递归。一张牌一张牌累加,概率累加即可。
时间复杂度:O(N*b)。

代码用golang编写。代码如下:

  1. package main
  2. import "fmt"
  3. func main() {
  4. ret := f2(5, 2, 3)
  5. fmt.Println(ret)
  6. }
  7. func f1() float64 {
  8. return p1(0)
  9. }
  10. // 游戏的规则,如上
  11. // 当你来到cur这个累加和的时候,获胜概率是多少返回!
  12. func p1(cur int) float64 {
  13. if cur >= 17 && cur < 21 {
  14. return 1.0
  15. }
  16. if cur >= 21 {
  17. return 0.0
  18. }
  19. w := 0.0
  20. for i := 1; i <= 10; i++ {
  21. w += p1(cur + i)
  22. }
  23. return w / 10
  24. }
  25. // 谷歌面试题扩展版
  26. // 面值为1~N的牌组成一组,
  27. // 每次你从组里等概率的抽出1~N中的一张
  28. // 下次抽会换一个新的组,有无限组
  29. // 当累加和<a时,你将一直抽牌
  30. // 当累加和>=a且<b时,你将获胜
  31. // 当累加和>=b时,你将失败
  32. // 返回获胜的概率,给定的参数为N,a,b
  33. func f2(N int, a int, b int) float64 {
  34. if N < 1 || a >= b || a < 0 || b < 0 {
  35. return 0.0
  36. }
  37. if b-a >= N {
  38. return 1.0
  39. }
  40. // 所有参数都合法,并且b-a < N
  41. return p2(0, N, a, b)
  42. }
  43. // 游戏规则,如上,int N, int a, int b,固定参数!
  44. // cur,目前到达了cur的累加和
  45. // 返回赢的概率
  46. func p2(cur int, N int, a int, b int) float64 {
  47. if cur >= a && cur < b {
  48. return 1.0
  49. }
  50. if cur >= b {
  51. return 0.0
  52. }
  53. w := 0.0
  54. for i := 1; i <= N; i++ {
  55. w += p2(cur+i, N, a, b)
  56. }
  57. return float64(w) / float64(N)
  58. }
  59. // f2的改进版本,用到了观察位置优化枚举的技巧
  60. // 可以课上讲一下
  61. func f3(N int, a int, b int) float64 {
  62. if N < 1 || a >= b || a < 0 || b < 0 {
  63. return 0.0
  64. }
  65. if b-a >= N {
  66. return 1.0
  67. }
  68. return p3(0, N, a, b)
  69. }
  70. func p3(cur int, N int, a int, b int) float64 {
  71. if cur >= a && cur < b {
  72. return 1.0
  73. }
  74. if cur >= b {
  75. return 0.0
  76. }
  77. if cur == a-1 {
  78. return 1.0 * float64(b-a) / float64(N)
  79. }
  80. w := p3(cur+1, N, a, b) + p3(cur+1, N, a, b)*float64(N)
  81. if cur+1+N < b {
  82. w -= p3(cur+1+N, N, a, b)
  83. }
  84. return float64(w) / float64(N)
  85. }
  86. // f3的改进版本的动态规划
  87. // 可以课上讲一下
  88. func f4(N int, a int, b int) float64 {
  89. if N < 1 || a >= b || a < 0 || b < 0 {
  90. return 0.0
  91. }
  92. if b-a >= N {
  93. return 1.0
  94. }
  95. dp := make([]float64, b)
  96. for i := a; i < b; i++ {
  97. dp[i] = 1.0
  98. }
  99. if a-1 >= 0 {
  100. dp[a-1] = 1.0 * float64(b-a) / float64(N)
  101. }
  102. for cur := a - 2; cur >= 0; cur-- {
  103. w := dp[cur+1] + dp[cur+1]*float64(N)
  104. if cur+1+N < b {
  105. w -= dp[cur+1+N]
  106. }
  107. dp[cur] = float64(w) / float64(N)
  108. }
  109. return dp[0]
  110. }

执行结果如下:


左神java代码

2021-08-17:谷歌面试题扩展版,面值为1~N的牌组成一组,每次你从组里等概率的抽出1~N中的一张,下次抽会换一个新的组,有无限组,当累加和<a时,你将一直抽牌,当累加和>=a且<b时,你将获胜的更多相关文章

  1. AMD系统中,virtualbox 不能为虚拟电脑打开一个新任务

    我的电脑装的Genymotion,之前开发Andriod4.4版本的时候在Genymotion上都可以运行,可是开发Andriod5.0+的时候,Genymotion就不能运行了,究其原因,原来是Vi ...

  2. sql语句联表更新(从一个数据库中的一张表更新到另一个数据库的另一张表)

    一.sql server数据库写法: update a set a.ksgmm=b.ksgmm,a.ksgm=b.ksgm,a.scztm=b.scztm,a.sczt=b.sczt from lan ...

  3. SQL数据库,如何把服务器中的一张表插入到另外一个服务器的一张表中

    先开启 exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Ad Hoc Distributed Qu ...

  4. 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展

    将一个对象相同的属性(不区分大小写)赋值给一个新对象   1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...

  5. RocketMQ一个新的消费组初次启动时从何处开始消费呢?

    目录 1.抛出问题 1.1 环境准备 1.2 消息发送者代码 1.3 消费端验证代码 2.探究CONSUME_FROM_MAX_OFFSET实现原理 2.1 CONSUME_FROM_LAST_OFF ...

  6. Kubernetes——自动扩展容器!假设你突然需要增加你的应用;你只需要告诉deployment一个新的 pod 副本总数即可

    参考:http://kubernetes.kansea.com/docs/hellonode/ 现在你应该可以通过这个地址来访问这个service: http://EXTERNAL_IP:8080 或 ...

  7. 剑指offer面试题-Java版-持续更新

    最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...

  8. 分析Linux内核创建一个新进程的过程【转】

    转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用 ...

  9. php数组根据某一个键值,把相同键值的合并生成一个新的二维数组

    http://blog.csdn.net/xyzchenxiaolin/article/details/51700485 源数据: $infos = array( array( 'a' => 3 ...

  10. VirtualBox不能为虚拟电脑打开一个新任务——The VirtualBox kernel modules do not match this version of VirtualBox

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=608 一.问题产生的环境 物理机操作系统:Ubuntu 17.10 (Ubuntu版本查看命令: cat /etc/ ...

随机推荐

  1. HTTP 返回状态码403,404,502等不同报错原因及解决思路

    要学会看日志rpm的默认路径 /var/log/nginx/源码的默认路径 安装路径/logs/ 排错思路: 1)服务器启动失败,直接"nginx -t"测试语法   看配置文件是 ...

  2. Go语言 :使用简单的 for 迭代语句进行 TDD 驱动测试开发与 benchmark 基准测试

    前提准备与运行环境请参考:(新手向)在Linux中使用VScode编写 "Hello,world"程序,并编写测试-Ubuntu20.4   在 Go 中 for 用来循环和迭代, ...

  3. CSS必知必会

    CSS概念 css的使用是让网页具有统一美观的页面,css层叠样式表,简称样式表,文件后缀名.css css的规则由两部分构成:选择器以及一条或者多条声明 选择器:通常是需要改变的HTML元素 声明: ...

  4. Three.js 进阶之旅:全景漫游-初阶移动相机版

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 摘要 3D 全景技术可以实现日常生活中的很多功能需求,比如地图的街景全景模式.数 ...

  5. 免费Midjourney AI绘画Prompt提示词平台合集

    Midjourney AI绘图最关键的地方在于Prompt提示词写的好,一个好的提示词可以让AI模型创造出更优质的绘图,以下是8个免费的Midjourney Prompt提示词辅助平台. ​ 编辑切换 ...

  6. Node.js中理解asyncmap函数 ,爬取王者荣耀荣耀官网壁纸400多张

    async/mapLimit函数理解 const phantom = require('phantom') const express = require('express'); const app ...

  7. Java---->枚举类

    自定义的枚举类 package doy1; /** * @author shkstart * @create 2021-10-28 19:23 */ /** * 一.枚举类的使用 * 1.枚举类的理解 ...

  8. 【算法总结】强化学习部分基础算法总结(Q-learning DQN PG AC DDPG TD3)

    总结回顾一下近期学习的RL算法,并给部分实现算法整理了流程图.贴了代码. 1. value-based 基于价值的算法 基于价值算法是通过对agent所属的environment的状态或者状态动作对进 ...

  9. python之修改本地Ip地址

    安装模块pip install wmi # -*- coding: cp936 -*- # # FileName: ModifyIP.py # Date : 2008-01-15 # import w ...

  10. [网络/Java EE/Web]Tomcat/Nginx中配置全局的安全响应头(header)——X-Frame-Options / X-XSS-Protection / X-Content-Options

    Step1 配置Tomcat step1.1 查看是否已配置目标的HTTP网络安全头 方式1 – Tomcat / conf/web.xml cat /opt/myTomcat/conf/web.xm ...