多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 算法-找出其他出現偶數次的數組中出現1次,2次,3次的數

算法-找出其他出現偶數次的數組中出現1次,2次,3次的數

來源:程序員人生   發布時間:2015-06-11 08:14:42 閱讀次數:2621次
#include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <iostream> #include<vector> #include<string> #include<set> #include<unordered_set> #include<queue> #include<map> using namespace std; //1。 找出1個出現1個次的數 /* 思路就是用異或,異或的作用能夠將bit位相同的1,1 0,0變成0 這正好與偶數的思路相應。把所有數異或起來,就會發現,只出現1次的數上面的1的bit位才會被保存。 */ int findone(int a[],int n) { int ans = 0; for (int i = 0; i < n; i++) { ans ^= a[i]; } return ans; } //2。找出兩個出現1次的數 /* 出現兩個1次的數再用1的方法就不起效了,但是有1種辦法,就是把全部數組分成兩部份。 每部份包括1個數,這樣就能夠轉換為求出現1次數的方法。 如何分解呢,首先需要找出這兩個數的區分: a: 0 0 1 1 b: 0 1 0 1 異或:0 1 1 0 我們會發現a和b的比特位異或,有4種情況,其中兩種情況結果是1.當結果比特位異或等于1的時候,a和b的比特位肯定不同。 這就是區分,我們可以通過找某1位比特位是不是為1來辨別成2個組。 */ int findbit1(int n) {//找出低位開始第1個為1的比特位,其他清0 return n&~(n - 1); // n&-n也能夠 } void findtwo(int a[],int n) { int ans1 = 0, ans2 = 0; int flag = findone(a, n); //全部異或,結果=a^b 其他變成0; flag = findbit1(flag); for (int i = 0; i < n; i++) { if (a[i] & flag) ans1 ^= a[i]; else ans2 ^= a[i]; } cout << ans1 << endl; cout << ans2 << endl; } //3。找出3個出現1次的數 /* 這次更加困難了,由于沒法直接劃分成2組。 比如a,b,c a 0 0 0 0 1 1 1 1 b 0 0 1 1 0 0 1 1 c 0 1 0 1 0 1 0 1 r 0 1 1 0 1 0 0 1 當結果為1的時候a,b,c有兩種可能,1種是0 0 1 還有1種是 1 1 1這就沒法辨別是哪一種情況了,比較辣手 網上有種方法是不管372101,先按 0 0 1這類情況算,然后得出的ans1和ans2比較 再分多種情況,比較復雜。 下面這類用到了反證法還有函數構造進程比較復雜,如果理解了,直接就嚕出來了,比較推薦 1. 首先異或所有數 x=a^b^c.....其他異或=0 2. 再次用x異或所有數 x^a[i] 。 這樣對出現偶數次的沒有區分,由于我們不關心他們的實際大小 但是 x^a, x^b , x^c 這3個數 就起到了很大的變化。我們的目標是將這3個數劃分成唯1的兩組。 我們會發現 x^a ^ x^b ^ x^c =0, 而且3個數都不可能為0,而且互不相同。(由于x^a=b^c,b不等于c所以b^c不等于0) 然后做1個技能,令 n1=f(x^a),n2=f(x^b),n3=f(x^c),ni=f(x^a[i]) 其中f的作用是保存低位最近那個1其他全為0 ( XXXXX1000變成 000001000) 然后n1,n2,n3中就都有且只有1個位為1,現在區分n1,n2,n3的問題又成為 n1 0 0 0 0 1 1 1 1 n2 0 0 1 1 0 0 1 1 n3 0 1 0 1 0 1 0 1 r 0 1 1 0 1 0 0 1 之前是3個數可能同時為1,也可能只有1個為1,這樣r=1; 但是3個數不可能同時為1. 不然與n1^n2^n3=0矛盾(由于x^a ^ x^b ^ x^c =0保證了任意1位上不可能3個1) 終究: 只需要 p=f(n1^n2^n3) 挑選 p&f(x^a[i])!=0 為1組 ==0為1組就好了 */ void findthree(int a[], int n) { int x = findone(a, n); int p = 0; for (int i = 0; i < n; i++) p ^= findbit1(x^a[i]); p = findbit1(p); int ans1 = 0, ans2 = 0, ans3 = 0; for (int i = 0; i < n; i++) { if (p&findbit1(x^a[i])) ans1 ^= a[i]; } cout << ans1 << endl; //將ans1踢出 for (int i = 0; i < n; i++) { if (ans1 == a[i]) { swap(a[i], a[n - 1]); break; } } findtwo(a, n - 1); } int main(){ int a1[] = { 1, 1, 2, 2, 3, 4, 4 }; int a2[] = { 1, 1, 2, 2, 3, 4, 4 ,5}; int a3[] = { 6, 1, 1, 2, 2, 3, 4, 4, 5 }; cout << "找1個" << endl; cout << findone(a1, sizeof(a1) / sizeof(int))<<endl; cout << "找兩個" << endl; findtwo(a2, sizeof(a2) / sizeof(int)); cout << "找3個" << endl; findthree(a3, sizeof(a3) / sizeof(int)); getchar(); getchar(); return 0; }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美在线天堂 | 国产精品第3页 | 性做久久久久 | 欧美一区二区在线免费观看 | 看大片免费网站 | 免费羞羞| 成年人的天堂 | 99精品国产一区二区三区 | 亚洲欧美日产综合一区二区三区 | 亚洲综合激情另类小说区 | 自拍偷拍第一页 | 国产美女一级做受在线观看 | 在线人成精品免费视频 | 波多野结衣一区二区三区在线观看 | 一区二区三区在线播放视频 | 亚洲三级在线视频 | 亚洲欧美一区二区久久 | 最近免费字幕高清在线观看 | 可以免费观看一级毛片黄a 可以免费看的黄色网址 | 欧美yw精品日本国产精品 | 亚洲天堂最新地址 | 国产精品爱久久久久久久 | 花蝴蝶亚洲一区二区三区 | 午夜dj视频在线观看免费 | 欧美日韩福利视频一区二区三区 | 成人在线一区二区三区 | 久久久无码精品亚洲日韩按摩 | 天堂亚洲欧美日韩一区二区 | 国产福利乳摇在线播放 | 久久国产精品高清一区二区三区 | 老司机午夜性大片免费 | 亚洲中字 | 欧洲美女人牲交一级毛片 | 国产91精品久久久久久久 | 日本爽 | 黄色在线网站 | 玖玖五月 | 亚洲精品欧美精品 | 亚洲网站在线 | 五月天欧美 | 久久456|