这是一道微软的面试真题
问:已知有个rand7()的函数,返回1到7随机自然数,让利用这个rand7()构造rand10() 随机1~10。
答:这题主要考的是对概率的理解。程序关键是要算出rand10,1到10,十个数字出现的考虑都为10%.根据排列组合,连续算两次rand7出现的组合数是7*7=49,这49种组合每一种出现考虑是相同的。怎么从49平均概率的转换为1到10呢?方法是:
1.rand7执行两次,出来的数为a1=rand7()-1,a2=rand7()-1.
2.如果a1*7+a2<40,b=(a1*7+a2)/4+1;如果a1*7+a2>=40,重复第一步。
参考代码如下所示:
int rand7()
{
return rand()%7+1;
}
int rand10()
{
int a71,a72,a10;
do
{
a71= rand7()-1;
a72 = rand7()-1;
a10 = a71 *7 + a72;
} while (a10>= 40);
return (a71*7+a72)/4+1;
}
我们解题的时候一定要想一下最优解,不然可能让我们就算做出来了这道题可能也得不了高分 今年的求职因为疫情原因可谓格外的惨烈,我们建了一个微信的讨论群,在群里会分享解题方法和面试官的出题思路,还有一些行业的内部信息。篇幅所限,在此不能一一赘述,要制霸面试,需要系统的把lc啃下来,并能触类旁通,每几个月我们几个谷歌微软的leader也会开班授课,比较系统的讲解leetcode,也会带同学做做内部项目,帮助同学增加项目经历。
进群可以加微信:Google_Mingshuo
最后祝大家能够顺利入职大厂,拿到offer~