• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            題目描述:

            Given an array of n integers, such that each number in the array appears exactly twice, except for three numbers (say a, b and c) which appear exactly once.

            In O(n) time and O(1) space find a,b and c.

            分析:

            先看這樣一道題:

            n個(gè)數(shù)中有且僅有一個(gè)數(shù)出現(xiàn)了奇數(shù)次(其它數(shù)都出現(xiàn)了偶數(shù)次),如何用線性時(shí)間常數(shù)空間找出這個(gè)數(shù)。

            解法如下:

            從頭到尾異或一遍,結(jié)果就是要求的那個(gè)數(shù)。(原理很清楚明了)

            再看稍微加強(qiáng)版:

            n個(gè)數(shù)中有且僅有兩個(gè)數(shù)出現(xiàn)了奇數(shù)次(其它數(shù)都出現(xiàn)了偶數(shù)次),如何用線性時(shí)間常數(shù)空間找出這個(gè)數(shù)。

            解法比較巧妙,主要思想是將元素分成兩組,每組中有且僅有一個(gè)數(shù)出現(xiàn)了奇數(shù)次(其它數(shù)都出現(xiàn)了偶數(shù)次),然后應(yīng)用上題的結(jié)論解答,至于如何分組,見(jiàn)下:

            1、異或所有元素得xors

            2、找出xors中不為0的一個(gè)bit位(通常從右向左找出第一個(gè)不為0的)

            3、以2中找到的bit位為sentinel,將數(shù)組分為兩組

            本題:

            思路類(lèi)似于求解上題,關(guān)鍵是找出第一個(gè)來(lái),然后借助上題結(jié)論求另外兩個(gè)

            // Let s = a ^ b ^ c.? We know that s not in (a, b, c),
            // since if s == a, say, then b ^ c == 0 and b == c.?
            // Let f(x) be the lowest bit where x differs from s.?
            // The algorithm computes flips = f(a) ^ f(b) ^ f(c),
            // since the numbers appearing an even number of times cancel.?
            // The variable flips has parity 1, so it is non-zero,
            // and lowbit(flips) is a bit where one or three of a, b, c
            // differ from s.? It can't be three, however, so the final
            // exclusive-or includes exactly one of a, b, c.

            代碼:

            #include <iostream>

            using namespace std;

            // get lowest different bit
            int lowbit(int x)
            {
            ??? return x & ~(x - 1);
            }

            // Given an array of n integers, such that each number
            // in the array appears exactly twice, except for two
            // numbers (say a and b) which appear exactly once.
            //
            // In O(n) time and O(1) space find a and b.
            // e.g.
            // { 2 3 3 2 4 6 4 7 8 8 }? ---> a/b = { 6 7}
            void Find2(int seq[], int n, int& a, int& b)
            {
            ??? ////XOR
            ??? int xors = 0;
            ??? for(int i = 0; i < n; i++)
            ??????? xors ^= seq[i];

            ??? ////get different bit
            ??? int diff = lowbit(xors);

            ??? ////
            ??? a = 0;
            ??? b = 0;
            ??? for(int i = 0; i < n; i++)
            ??? {
            ??????? if(diff & seq[i])
            ??????????? a ^= seq[i];
            ??????? else
            ??????????? b ^= seq[i];
            ??? }
            }


            // Given an array of n integers, such that each number
            // in the array appears exactly twice, except for three
            // numbers (say a, b and c) which appear exactly once.
            //
            // In O(n) time and O(1) space find a,b and c.
            // e.g.
            // { 2 3 3 2 4 6 4 7 8 8 1 }? ---> a/b = { 6 7 1}


            // Let s = a ^ b ^ c.? We know that s not in (a, b, c),
            // since if s == a, say, then b ^ c == 0 and b == c.?
            // Let f(x) be the lowest bit where x differs from s.?
            // The algorithm computes flips = f(a) ^ f(b) ^ f(c),
            // since the numbers appearing an even number of times cancel.?
            // The variable flips has parity 1, so it is non-zero,
            // and lowbit(flips) is a bit where one or three of a, b, c
            // differ from s.? It can't be three, however, so the final
            // exclusive-or includes exactly one of a, b, c.

            void Find3(int seq[], int n, int& a, int& b, int& c)
            {
            ??? ////XOR
            ??? int xors = 0;
            ??? for(int i = 0; i < n; i++)
            ??????? xors ^= seq[i];

            ??? ////
            ??? int flips = 0;
            ??? for(int i = 0; i < n; i++)
            ??????? flips ^= lowbit(xors ^ seq[i]);
            ??? flips = lowbit(flips);

            ??? ////get one of three
            ??? a = 0;
            ??? for(int i = 0; i < n; i++)
            ??? {
            ??????? if(lowbit(seq[i] ^ xors) == flips)
            ??????????? a ^= seq[i];
            ??? }

            ??? ////swap a with the last element of seq
            ??? for(int i = 0; i < n; i++)
            ??? {
            ??????? if(a == seq[i])
            ??????? {
            ??????????? int temp = seq[i];
            ??????????? seq[i] = seq[n - 1];
            ??????????? seq[n - 1] = temp;
            ??????? }
            ??? }

            ??? ////call Find2() to get b and c
            ??? Find2(seq, n - 1, b, c);
            }

            int _tmain(int argc, _TCHAR* argv[])
            {
            ??? int a,b,c;
            ??? int test1[] = { 2, 3, 3, 2, 4, 6, 4, 7, 8, 8 };
            ??? Find2(test1, 10, a, b);
            ??? cout<<"a = "<<a<<" , b = "<<b<<endl;

            ??? int test2[] = {1 , 2 , 3 };//{ 2, 3, 3, 2, 4, 6, 4, 7, 8, 8, 1 };
            ??? Find3(test2, 3, a, b, c);
            ??? cout<<"a = "<<a<<" , b = "<<b<<" , c = "<<c<<endl;
            ??? system("pause");
            ??? return 0;
            }

            ?

            本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/yysdsyl/archive/2009/06/22/4289828.aspx

            亚洲国产成人久久精品99 | 久久精品国产亚洲AV蜜臀色欲| 日韩精品久久久久久| 久久99精品国产麻豆蜜芽| 日韩欧美亚洲综合久久| 久久久无码精品亚洲日韩按摩| 久久精品国产99国产精偷| 久久精品国产亚洲Aⅴ香蕉 | 国产免费福利体检区久久 | 看全色黄大色大片免费久久久| 久久精品免费全国观看国产| 97精品久久天干天天天按摩| 久久99九九国产免费看小说| 欧美一区二区精品久久| 亚洲欧美日韩久久精品第一区| 久久精品国产亚洲一区二区| 久久人人爽人人爽人人片AV高清 | 国产精品综合久久第一页 | 久久精品一本到99热免费| 久久精品草草草| 久久久久亚洲AV无码永不| 午夜视频久久久久一区 | 日本精品久久久中文字幕| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲国产天堂久久综合网站| 亚洲va中文字幕无码久久| 色狠狠久久综合网| 久久免费香蕉视频| 精品国产青草久久久久福利| 国产精品久久久久国产A级| 五月丁香综合激情六月久久| 日日狠狠久久偷偷色综合免费 | 久久久精品波多野结衣| 久久久久久a亚洲欧洲aⅴ| 97久久超碰成人精品网站| 99久久精品费精品国产一区二区 | 国产精品视频久久| 77777亚洲午夜久久多喷| 亚洲国产精品无码久久久蜜芽| 久久精品aⅴ无码中文字字幕不卡| 久久久久久久免费视频|