问个算法方面的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
john990

问个算法方面的问题

  •  
  •   john990 May 15, 2014 3617 views
    This topic created in 4365 days ago, the information mentioned may be changed or developed.
    现有一百万个数(无规律,可重复),把这些数复制一份,发现多了一个(一百万零一个),怎么用最快的方法找到多了什么数?
    22 replies &nsp;  2014-05-17 00:16:15 +08:00
    skydiver
        1
    skydiver  
       May 15, 2014   1
    异或
    dennisyang
        2
    dennisyang  
       May 15, 2014
    分块hash?
    john990
        3
    john990  
    OP
       May 15, 2014
    @skydiver 能详细点吗?
    @dennisyang 这个是今天的面试题,我也是这么说的,面试的人说有更简单的。
    skydiver
        4
    skydiver  
       May 15, 2014
    @john990 所有的数字异或到一起。重复的数字异或到一起就变成0了,剩下的就是多出来的数。
    这是一个经典的面试题啊。。
    john990
        5
    john990  
    OP
       May 15, 2014
    @skydiver oh,明白了,谢谢了,看来算法是硬伤啊
    skydiver
        6
    skydiver  
       May 15, 2014
    @john990 这个题基本也考不了什么能力,知道就是知道,不知道就是不知道……拿这个题考人的公司感觉不怎么靠谱……
    bengol
        7
    bengol  
       May 15, 2014
    为什么会多了一个?
    john990
        8
    john990  
    OP
       May 15, 2014
    @bengol x^x=0,x^0=x ;那两百万个数中任意一个数都是偶数个,所以异或到最后就剩下多出来的那个
    YouXia
        9
    YouXia  
       May 15, 2014
    @skydiver 基本上G,M等家都问这种数学类型的题目。
    txx
        10
    txx  
       May 15, 2014
    jsonline
        11
    jsonline  
       May 16, 2014
    对啊,为什么会多一个,搞清楚这个问题价值会更大吧。
    wy315700
        12
    wy315700  
       May 16, 2014
    把所有的数异或一下 最后的结果就是那个多出来的数
    简单的面试题
    stevenyou
        13
    stevenyou  
       May 16, 2014   1
    sum(一百万零一个) - sum(一百万个数)

    得到的结果就是多的那一个
    stevenyou
        14
    stevenyou  
       May 16, 2014
    效率是O(n)
    john990
        15
    john990  
    OP
       May 16, 2014   1
    @stevenyou 嗯,好办法
    cassyfar
        16
    cassyfar  
       May 16, 2014   1
    @stevenyou 有overflow的风险
    @john990
    stevenyou
        17
    stevenyou  
       May 16, 2014   1
    @cassyfar 是有overflow的问题,但是从两个数可以看出来的。如果是32bit int
    sum(一百万零一个) = -32768
    sum(一百万个数) = 32767
    可以知道多出的那个数是1

    当然了,xor的方法是最好的。
    stevenyou
        18
    stevenyou  
       May 16, 2014
    @cassyfar sorry , 16bit int
    cassyfar
        19
    cassyfar  
       May 16, 2014   1
    @stevenyou 对啊 但是如果overflow之后又overflow就麻烦了 毕竟100万个数的和是个很大的和
    riaqn
        20
    riaqn  
       May 16, 2014   2
    @cassyfar
    @stevenyou
    实际上 overflow 没有影响,2's complement 表示的整数是个阿贝尔群。
    以下代码在 32bit 上运行, sizeof(int)=4

    ~ cat test.c
    #include <stdio.h>
    int main() {
    int a = 1234567890;
    int b = 2134567890;
    printf("%d\n", a + b);
    printf("%d\n", a + b - a);
    }
    ~ gcc -o test test.c
    ~ ./test
    -925831516
    2134567890
    cassyfar
        21
    cassyfar  
       May 16, 2014
    @stevenyou 确实没影响 只要差值保留住就可以了 和overflow多少次无关
    Virtao
        22
    Virtao      May 17, 2014
    之前V2EX上就有个类似的题目,再次分享我的总结:

    http://blog.virtao.org/articles/163.html

    另外严重同意 @skydiver 的说法,这类题目玩玩可以,当面试题没意义。万一碰到个大牛恰好这个题目没碰到过呢?
    About     Help     Advertise     Blog     API     FAQ     Solana     5744 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 60ms UTC 01:40 PVG 09:40 LAX 18:40 JFK 21:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86