user-0 提问: 大佬们，这个难题的思路是什么？顶级大佬才会解！

回复:
user: user-1
content: 仅供参考//随机产生100000000个取值范围为[0～2的32次方减1]的数据， //然后让用户输入一个数据，判断用户输入的数据是不是包含在前面随机产生的数据中。 //要求：当用户输入完成后，必须在1毫秒(千分之一秒)之内完成判断。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <malloc.h> long int i; unsigned long ul; unsigned long *d; unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } void main() {     d=(unsigned long *)calloc(1<<(32-5),sizeof(unsigned long));     if (NULL==d) {         printf("Can not calloc(%d,%d)!\n",1<<(32-5),sizeof(unsigned long));         return;     }     srand(time(NULL));     for (i=0;i<100000000;i++) {         while (1) {             ul=ulrand();             if (0==(d[ul>>5]&(1lu<<(ul%32)))) {                 d[ul>>5]|=1<<(ul%32);                 break;             }         }         if (0==i%1000000) printf("%09d,%10lu\n",i,ul);     }     while (1) {         printf("\nInput a number:");         fflush(stdout);         rewind(stdin);         if (1==scanf("%lu",&ul)) break;     }     if (d[ul>>5]&(1<<(ul%32))) printf("Include.\n"    );     else                       printf("Not include.\n");     free(d); } //000000000,2135468533 //001000000,2465805973 //002000000,3844079964 //003000000,1883232874 //004000000,1204697784 //005000000,4050838287 //006000000,3802081245 //007000000,1586042671 //008000000,3119931368 //009000000, 251096899 //010000000,3491239701 //011000000,3365323844 //012000000,2191846708 //013000000,1879478195 //014000000,1112631457 //015000000,1927301519 //016000000,1717332861 //017000000,2922278240 //018000000, 694854106 //019000000, 273255526 //020000000, 398518467 //021000000,3270756812 //022000000,1500289424 //023000000,1502241936 //024000000,1770380660 //025000000,3668842116 //026000000,3255869879 //027000000,1299184024 //028000000,1072990028 //029000000, 242094712 //030000000,3789344297 //031000000,2599365925 //032000000, 962754138 //033000000,2055075654 //034000000,4083452879 //035000000, 489250842 //036000000, 611455230 //037000000, 277350616 //038000000,1597410795 //039000000,3224173662 //040000000,2291446877 //041000000,2546280575 //042000000,2509145642 //043000000,2371773252 //044000000, 635555963 //045000000,2674538666 //046000000,4253690312 //047000000,2675755514 //048000000,1269320296 //049000000,3172516920 //050000000,1430265210 //051000000, 196156173 //052000000,2470825669 //053000000,2536750977 //054000000,1182829949 //055000000,3202826434 //056000000,2263336265 //057000000, 313302924 //058000000,3630264578 //059000000,1154892716 //060000000,2985304230 //061000000,1252204837 //062000000,1292076720 //063000000, 242249250 //064000000,3999999961 //065000000, 431166416 //066000000,1366947236 //067000000,1414387330 //068000000,2143784481 //069000000,3242175409 //070000000,4158065163 //071000000,1425449573 //072000000,2493600232 //073000000,1316783455 //074000000,3723170478 //075000000,3064111466 //076000000, 408557403 //077000000,3722586955 //078000000,3801652651 //079000000,3788160154 //080000000,3329440047 //081000000,1408976868 //082000000, 471838899 //083000000,2145198260 //084000000,3781081738 //085000000,3439027738 //086000000,1150808750 //087000000,2782578638 //088000000,  85604584 //089000000,2704078162 //090000000, 584840269 //091000000,3854577719 //092000000,2823653537 //093000000, 797877025 //094000000,2248017755 //095000000,1787038685 //096000000,2816548567 //097000000, 489107494 //098000000, 911680090 //099000000,3677777147 // //Input a number:3677777147 //Include.

user: user-2
content: 基本上就是大佬的思路了,哈希表是最合适的.时间是o(n),应该没有更优的方法了.

user: user-3
content: 引用 4 楼 u011280788 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 注意初始化一下aaa数组； 算法是：申请256长度的数组，先初始化为0，然后，[0, 255]中的数组作为下标，元素的值是出现的次数。  #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(void) {     int num_list[256] = { 0 }, i;     int num;      srand(time(NULL));     for (i = 0; i < 100; i++) {         num = random() % 256;         num_list[num]++;     }      for (i = 0; i < 256; i++)         if (num_list[i] == 1)             printf("%d appears %d time.\n", i, num_list[i]);     /*         else             printf("%d appears %d times.\n", i, num_list[i]);             */      return 0;  }  思路是好的，小瑕疵是题设给定的 已知一组数字，您在产生数字的时候，顺便做了逻辑处理。[/quote] 改一下呢，如果什么事情都给你做的很完美，你拿来就能用，那么自己在解决这道题上扮演什么角色呢？

user: user-4
content: 引用 2 楼 cfjtaishan 的回复:注意初始化一下aaa数组； 算法是：申请256长度的数组，先初始化为0，然后，[0, 255]中的数组作为下标，元素的值是出现的次数。  #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(void) {     int num_list[256] = { 0 }, i;     int num;      srand(time(NULL));     for (i = 0; i < 100; i++) {         num = random() % 256;         num_list[num]++;     }      for (i = 0; i < 256; i++)         if (num_list[i] == 1)             printf("%d appears %d time.\n", i, num_list[i]);     /*         else             printf("%d appears %d times.\n", i, num_list[i]);             */      return 0;  }  思路是好的，小瑕疵是题设给定的 已知一组数字，您在产生数字的时候，顺便做了逻辑处理。

user: user-5

user: user-6
content: 范围是[0，255]  用位图表示就可以了， 一个字节8位， 用32个字节即可标识所有的数  由于每个数存在3种状态：00：未出现过，01：出现过1次，10：出现过多次，因此32×2 = 64字节即可标识所有情况。  初始全部标0，  然后遍历数组中的每一个数字， 如果这个数字在位图中对应的状态为0，改为1，如果为1，改为2，如果为2，不变。  最后显示所有状态为01的，即为不重复的数

user: user-3
content: 引用 1 楼 user-7 的回复:int aaa[256]; for(int i=0;i<n;i++) {     int b;     cin>>b;     aaa[b]++; } for(int i=0;i<256;i++) if(aaa[i]==0)cout<<i<<" "; 注意初始化一下aaa数组； 算法是：申请256长度的数组，先初始化为0，然后，[0, 255]中的数组作为下标，元素的值是出现的次数。  #include <stdio.h> #include <stdlib.h> #include <time.h>  int main(void) {     int num_list[256] = { 0 }, i;     int num;      srand(time(NULL));     for (i = 0; i < 100; i++) {         num = random() % 256;         num_list[num]++;     }      for (i = 0; i < 256; i++)         if (num_list[i] == 1)             printf("%d appears %d time.\n", i, num_list[i]);     /*         else             printf("%d appears %d times.\n", i, num_list[i]);             */      return 0;  }

user: user-7
content: int aaa[256]; for(int i=0;i<n;i++) {     int b;     cin>>b;     aaa[b]++; } for(int i=0;i<256;i++) if(aaa[i]==0)cout<<i<<" ";