笔试题目
英雄每次升级都需要花费宝石,已知英雄每升一级成功的概率如下:
- 英雄升级,从0级升到1级,概率100%。
- 从1级升到2级,有1/3的可能成功,1/3的可能停留原级,1/3的可能下降到0级;
- 从2级升到3级,有1/9的可能成功;4/9的可能停留原级;4/9的可能下降到1级。
- 每次升级要花费一个宝石,不管成功还是停留还是降级。
求英雄从0级升到3级平均花费的宝石数目?
【来自】微信公众好:算法爱好者
答案 : 30
说明:
当我在算法爱好者微信公众号里看到此题下面网友的评论后发现,有几个网友用编程语言做出来了,之后我打算用javascript来实现。 由于我个人还是比较熟悉javascript, 所以我就提供了javascript代码,两种版本,码农级别的和优化精简级别的。 欢迎java, python, c,c## 等大神们在下面评论,并提供你们的思路及代码。谢谢!
用代码验证结果:
普通码农级别:
1234567891011121314151617181920212223242526272829303132333435363738
var foo=(level)=>{ if(level == 0) return 1;//从0级到1级 if(level == 1){//从1级到2级 var r = 3*Math.random(); if(r<1){ return 2//升级到2级 }else if(r<2){ return 1//保留原级 }else{ return 0//降级到0级 } } if(level == 2){ var r=Math.random()*9; if(r<1){//从2级升级到3级 return 3 }else if(r<5){ return 2//保留原级 }else{ return 1//降级到1级 } }}var bar = () => {//计算一次能拿的宝石数目 var lv = 0; var gem = 0; while (lv != 3) { lv = foo(lv); gem++; } return gem; } (function (t) { var gs = 0; for (var i = 0; i < t; i++) gs += bar(); console.log(gs / t); })(1000);
大神级别(对我来说是大神级别 ^_^):
123456789101112131415161718192021222324252627282930
var n=100000;/*执行次数*/var result = ((t)=>{ var sum=0,i=0; while(i<t){sum += getGemCount();i++} return Math.round(sum/t); function getGemCount(){ var level=0,gem=0; while(level<3){ level=(function(lv){ switch(lv){ case 0:return 1;break; case 1: var r1=Math.floor(Math.random()*3); switch(r1){ case 0:return 2;break; case 1:return 1;break; case 2:return 0;break; } case 2: var r2=Math.random()*9; return r2<1? 3:r2<5 ? 2:1; break; } })(level); gem++; } return gem; }})(n);console.log(result);
提示:
本人大学毕业不久,工作经验不长,而且是一名少数民族,维吾尔族,汉语是我第二语言,因此在难免会有一些错别字,或者有使用不当的词,或者在提供的代码中有bug, 或者解释思路有错误,你若发现错误请在下面通过评论来指出错误,或者通过扫描下面的微信二维码,加我微信来告知我。下面我还提供了我的个人微信二维码,如果想跟我讨论技术问题,就加我个人微信。另外我还提供了我的个人微信转账二维码,如果你觉得我发布的内容有用,或者支持我的努力,请给我打个赏吧,让我更有动力去发布更有用的技术干货。谢谢!
![]() | ![]() |

