有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机
来源:互联网 发布:爱思助手mac 编辑:程序博客网 时间:2024/05/21 06:44
一、题目简介
这个题目出自一道面试题,题目描述如下:
有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V[N]里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1)。
此题思路如下:
设置一个整形nVal,用来存放get()返回的数。调用getNum()从V[N]取数,按一定概率存入nVal中(覆盖以前的),直到getNum()返回NULL。设getNum取的第i个数为nVali,nVali存入nVal中的概率为Pi。设Pi=1/i ( i已知时,所以这个概率很容易做到)。则nVali保留,并最后返回的情况是,nVali被存入num中,且nValj(i<j<=N)不被存入nVal。其概率为
P(nVali)=Pi*(1- Pi+1) * (1 - Pi+2)* ...(1 - PN)=1/i * (i/(i+1)) * ((i+1)/(i+20)*....((N-1)/N) = 1/N
二、实现代码
实现代码如下:
- int GetRand()
- {
- int i=1;
- int nRet = 0;
- int nVal = 0;
- while((nRet=getNum())!=NULL)
- {
- if(rand()%(i++)==0) nVal = nRet;
- }
- return nVal;
- }
0 0
- 阿里巴巴面试算法题:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N
- 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机
- 数组a[N],存放了N个数,其中某个数重复一次。 写一个函数,找出被重复的数字.时间复杂度必须为o(N)
- 写一个函数,要求传入一个1到n位数的随机数值,如传入随机数123456789,返回12345金币67银币89铜币,传入随机数1234,返回0金币12银币34铜币。 提示:推荐Int,Rnd,Mid,L
- 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数。
- 有一个整数n,写一个函数f(n),返回0到n之间出现的"1"的个数
- 写一个功能函数实现从数组中找出两个值相加等于某一个值,要求时间复杂度为 n;
- 数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
- 数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
- (思科笔试)数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
- 写一个函数参数是一个int数值要求倒着输出这个数,要求用到递归算法。
- 有一个随机函数fun()能产生0<=X<n的数,现在要用fun()函数来产生0<=Z<m的数。
- 编写一个void sort(int*x,int n)实现将x数组中的n个数据从大到小排序。n及数组元素在主函数中输入。将结果显示在屏幕上并输出到文件
- 数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)
- 本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数。
- 编写一个javscript函数 fn,该函数有一个参数 n(数字类型),其返回值是一个数组,该数组内是 n 个随机且不重复的整数,且整数取值范围是 [2, 32]。
- 对于一个整数n,有一个函数f(n) 可以计算到1到n之间的出现“1“的个数。
- 写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名
- 这才是http错误的最精准表达.....
- oracle 修改服务端字符集导致ORA-12712错误
- oracle exp、imp实现导出导入
- 一直以来伴随我的一些学习习惯(二):时间管理
- OpenCV成长之路(2):图像的遍历
- 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机
- android缓存数据到本地放在哪儿最好?
- [Effective Java Distilled] Item 二 当构造方法中有多个参数时,考虑建造者模式
- 由PostgreSQL的区域与字符集说起
- mysql中engine=innodb和engine=myisam的区别
- axis2 spring集成开发webServices
- Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
- JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
- Ubuntu 12.04下安装MySQL图解