一次遍历查找不同的数问题
admin 发表于 2010-04-21 | 来源:互联网 | 阅读:

输入一组偶数个的数,其中只有一对数是不同的,其他的都是成对出现。
数字的范围:0~INT_MAX
数字的个数:2~2000000个
如输入1 2 3 2 2 3
输出1 2
如果是用数组存数,数组最大只能开1000000这么大的。如何一遍扫描就能找出不同的两个数?

已经有13 个评论
  1. 421056 说:

    假设目标数组为dec[1000000]新建一个数组key,大小为INT_MAX扫描一次数组while(i<1000000)key[dec[i]]++;再扫描key,输出key[i] 不为2的数只想到这个

  2. sbamd 说:

    可以用map

  3. waterskin 说:

    可是这样就要开两个数组(一个1000000,一个INT_MAX),而系统的要求是最大就能开1000000,超过这么大就会判断出错的

  4. wuwei04 说:

    关于数的个数,定长数组是在堆栈中分配的,大小有限制,动态分配一个数组就是了,

  5. xwcylm 说:

    用map比较好,第一次出现的数直接当作key;循环一次,直接用key匹配,匹配到的直接将其从map中删掉最后map中剩下的2个,就是那不成对的一对了

  6. liangjiaqi 说:

    数组多大没有关系, 一个malloc 搞掂。这一题用map 性能应该差不多,或者更低吧

  7. my159 说:

    C/C++ code
    int size=6;
    int *arr=new int[size];
    arr[0]=2;
    arr[1]=2;
    arr[2]=3;
    arr[3]=2;
    arr[4]=2;
    arr[5]=3;

    int cur=-1,next=0;
    while(next<size)
    {
    if (cur==-1) arr[++cur]=arr[next++];
    else if (arr[cur]==arr[next]) cur–,next++;
    else
    {
    if (cur+1==next) cur++,next++;
    else arr[++cur]=arr[next++];
    }

    }
    for (int i=0;i<=cur;i++)
    cout<<arr[i]<<endl;

  8. rongxin 说:

    C/C++ code
    delete arr;

  9. 546914408 说:

    能不能用位运算呢?

  10. 红烧生鱼片 说:

    就是总数除以2的数组,再加一个标志位,表示不同的个数。以为最多不同的是总数除以2那么多。就是说的以空间来代替时间的浪费。

  11. 405290688 说:

    C/C++ code

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    int n;
    while(scanf("%d", &n) != -1 && n)
    {
    int diffx[32] = {0}, diffy[32] = {0};
    int select = 0;
    for(int i = 0; i < 2 * n; ++i)
    {
    int x;
    scanf("%d", &x);
    select ^= x;
    for(int j = 0; j < 32; ++j)
    {
    if(x & (1 << j))
    {
    diffx[j] ^= x;
    }
    else
    {
    diffy[j] ^= x;
    }
    }
    }
    int a = 0, b = 0;
    for(int j = 0; j < 32; ++j)
    {
    if(select & (1 << j))
    {
    a = diffx[j];
    b = diffy[j];
    break;
    }
    }
    if(b < a) { int t = a; a = b; b = t; }
    printf("%d %d\n", a, b);
    }
    return 0;
    }

  12. kook 说:

    终于找到了我想要的了呵呵

  13. awaywind 说:

    帮顶。

我要评论

评论功能因故关闭!

请加入我们的QQ群一起参与讨论:群号59400482(500人超级群)


返回首页 | 关于我们 | 联系我们 | 广告合作 | 网站地图 | 友情链接 | 版权声明