笔试情况
投递的后端岗位,笔试一共4道编程题,120min。
前两道题目比较简单,基本按照题目要求,使用很直接的思路就能做出来,主要看写代码熟练程度。
第三道题目是数学概率题目,第一次遇见没想清楚怎么做。最后直接输出了0.5,通过了一半的样例。(太菜了只能骗分)
第四道题目描述的是扑克牌做游戏。我在理解题意上出了问题,花了一个小时才发现理解错了,最后时间来不及了只考虑一种情况,居然也通过了一半的样例。
数学概率题
我主要想记录一下第三道题目。
有三个人A,B和主持人,他们在玩一个猜数字游戏:
现在有1~n一共n个数字,目标是找到其中的某个数字k。A和B轮流从1~n个数字中选一个数字,然后主持人会告诉他们数字大了小了还是相等。如果刚好选到了数字k,则那一方获胜。
假设A和B都是理性人,A开始选数字,他获胜的概率多大?
接下来一步一步分析情况:
- 【第一轮,第一次】A选数字,这时他选任意的数字,获胜概率都是 1 n \frac{1}{n} n1,因为A是理性人,既然这一次他自己的获胜概率固定了,那他就要尽可能减小B获胜的概率。要怎么做呢?A应该要选取最边上的数字,这样就算他没获胜,接下来B选取数字时的获胜概率也不过是 1 n − 1 \frac{1}{n-1} n−11而已。如果A一开始选取的数字是中间数字,比如 n / 2 n/2 n/2,那么当主持人宣布目标数字比这个数字小之后,B就可以在区间 [ 1 , n / 2 − 1 ] [1, n/2-1] [1,n/2−1]里面选取数字,这样B获胜的概率就会有 1 n / 2 − 1 \frac{1}{n/2-1} n/2−11。
- 【第一轮,第二次】假设A没有获胜,B选数字。因为A选的数字在最边上,无论主持人说“大了”还是“小了”,都不会给B更多有效的信息,他也只能从剩下的 n − 1 n-1 n−1个数字中随机选取。他要怎么选呢?和A一样,既然自己的概率固定不变了,就要尽可能降低对手获胜的概率。因此B也要选择最边上的数字。
就这样,A和B作为理性人,每次都会选择最边上的数字,直到有人猜出了正确的数字。以A的角度来看,我们计算他每一轮获胜的概率:
- 【第一轮】A获胜的概率是 1 n \frac{1}{n} n1
- 【第二轮】假设第一轮A和B都没有获胜,他们已经尝试了2个数字,因此这个概率是 1 − 2 n 1-\frac{2}{n} 1−n2,那么第二轮A获胜的概率是:( 1 − 2 n 1-\frac{2}{n} 1−n2) 1 n − 2 \frac{1}{n-2} n−21 = 1 n \frac{1}{n} n1
- 【第三轮】假设第一轮和第二轮A和B都没有获胜,他们已经尝试了4个数字,因此这个概率是 1 − 4 n 1-\frac{4}{n} 1−n4,那么第三轮A获胜的概率是:(1- 4 n \frac{4}{n} n4) 1 n − 4 \frac{1}{n-4} n−41 = 1 n \frac{1}{n} n1
找到规律发现每一轮A获胜的概率都是 1 n \frac{1}{n} n1,那只要把每一轮获胜概率加起来就是A整体获胜的概率了。
如果n是偶数,那一共会有
n
/
2
n/2
n/2轮,因此A的获胜概率就是
1
2
\frac{1}{2}
21
如果n是奇数,由于A开始选数字,因此A和B最多玩
n
−
1
2
\frac{n-1}{2}
2n−1轮,然后A选取最后的数字并且获胜。这个概率计算是:(
n
−
1
2
\frac{n-1}{2}
2n−1)
1
n
\frac{1}{n}
n1+(1-
n
−
1
n
\frac{n-1}{n}
nn−1) =
n
+
1
2
n
\frac{n+1}{2n}
2nn+1
A 获胜的概率 = { 1 2 , n是偶数 n + 1 2 n , n是奇数 A获胜的概率 = \begin{cases} \frac{1}{2}, & \text{n是偶数} \\ \frac{n+1}{2n}, & \text{n是奇数} \end{cases} A获胜的概率={21,2nn+1,n是偶数n是奇数