现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。
2017-01-14 12:06
861 查看
#include <iostream> using namespace std; //1亿 #define BILL (1000*1000*1000) //用int的32位存储标志: 1亿/32bit #define FLAGS 3125000 //随机数个数 #define RANCOUNT (1000*10000) #define BIT_SIZE 32 void printArray(int* arr, int len) { cout << "数组:" << endl; for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } cout << endl; } int* initRandom(int len, int range) { int* randoms = new int[len]; srand(unsigned(time(0))); for (int i = 0; i < len; i++) { randoms[i] = rand() % range; } return randoms; } void initTable(int* table, int size) { for (int i = 0; i < size; ++i) { table[i] = 1 << i; } } void mapRandomsIntoFlags(int* randoms, int ranLen, int* flag, int* table) { /* * 将随机数转化存入flag数组,先找到在哪个flag[i]元素,到找到里面对应的bit位,用按位或操作插入 * table[i]=1<<i */ for (int i = 0; i < ranLen; ++i) { int id = (randoms[i] - 1) / BIT_SIZE; flag[id] |= table[(randoms[i] - 1) % BIT_SIZE]; } } void findNotFlag(int* flags, int bill, int* table) { /*判断数是否存在,先找到数对应哪个flag[i],再找到里面对应的bit位,用按位与操作判断是否存在*/ for (int i = 1; i <= bill; ++i) { int id = (i - 1) / BIT_SIZE; if (!(flags[id] & table[(i - 1) % BIT_SIZE])) { cout << i << endl; } } } /*给出具体代码机器问题无法验证*/ int main() { // 1千万个随机数,随机数的范围在1到1亿之间 int* randoms = initRandom(RANCOUNT, BILL); // 用bit来标记数是否存在,int有32bit,则有1亿/32=3125000 int*flags = new int[FLAGS]; memset(flags, 0, FLAGS * sizeof(int)); //存在2^0,2^1....2^31标记用来操作指定bit int* table = new int[BIT_SIZE]; initTable(table, BIT_SIZE); mapRandomsIntoFlags(randoms, RANCOUNT, flags, table); findNotFlag(flags, BILL, table); return 0; }
相关文章推荐
- 现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来
- 现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。
- 10.百度最新面试题:现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来。
- 百度最新面试题:现在有1千万个随机数,随机数的范围在1到1亿之间。现在要求写出一种算法,将1到1亿之间没有在随机数中的数求出来
- scala BitSet实现算法:一千万个随机数,随机数范围在1到1亿之间,现在要求写出一种算法,将1到1亿之间没有出现的随机数求出来
- scala BitSet实现算法:一千万个随机数,随机数范围在1到1亿之间,现在要求写出一种算法,将1到1亿之间没有出现的随机数求出来
- 202 将1到1亿之间没有在随机数中的数求出来
- 一种算法思想:关于产生m个n范围内的不重复随机数(m<=n)
- Interview Q&A - 有十二个乒乓球形状、大小相同,其中只有一个重量与其它十一个不同,现在要求用一部没有砝码的天秤称三次,将那个重量异常的球找出来,并且要得出它比其它十一个球较重还是较轻
- 小王对既是素数又是回文的数特别感兴趣。比如说151既是素数又是个回文。现在小王想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 a 跟b 之间满足条件的数。(5 <= a < b <= 100
- 生成不重复随机数的一种算法。
- 一种石头,在某一高度扔下就会碎,在这个高度以下不会碎,高度以上一定碎。现在有4个石头,1000层的楼房,需要测定这个石头破碎的高度。求最少多少次一定可以测出来。
- C#--利用Random类产生10个[10,99]之间的随机数,并将这10个随机数在列表框中显示出来,每个数占一项。用户选择某项后,在右边标签中显示所选内容
- 某海量用户网站,用户拥有积分,积分可能会在使用过程中随时更新。现在要为该网站设计一种算法,在每次用户登录时显示其当前积分排名。用户最大规模为2亿;积分为非负整数,且小于100万。
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 生成互不相同随机数的一种算法
- 生成互不相同随机数的一种算法
- 产生一定范围随机数的通用算法公式
- 利用Random类产生10个[10,99]之间的随机数,并将这10个随机数在列表框中显示出来,每个数占一项。用户选择某项后,在右边标签中显示所选内容。
- 有n个人到图书馆还书,还有n个人到图书馆借书,若他们要还和借的书是同一种书且图书馆内现在没有此书,求他们要怎么排队才能保证每个人都能借到书