函數說明:
思路分析:
A: 首先可能會想到的辦法是:再建一個數組,進行數組的遍歷,遇到相同的數,就放到新的數組中,最終剩下的就是異數。
B:但是上面的這種辦法會有開空間的開銷,所以我們想到另外一種辦法:利用異或,我們知道異或就是相同的數異或為零,針對此題,最終異或下來的數就是異數。
#include<stdio.h>int main(){ int a[9] = {1,1,2,3,4,3,4,5,5}; int ret = 0; int i = 0; for(i = 0; i<9; i++) { ret ^= a[i]; } PRintf("%d/n",ret); return 0;}2)一個數組中有兩個數出現了一次,其余的數字出現了兩次。
思路分析:
第一步:將所有的數字異或,得到結果是不同數字的異或結果第二步:找上部結果中此數任意位置是1的,記錄此位置第三步:找原數組中在此位置是1的數第四步:將你剛開始設置的變量為0的與是第三步中的數異或, 得到一個不同的數第五步:將原來兩個數異或的結果與第四步中得到的不同數異或,得到另一個不同數
#include<stdio.h>void Find(int a[],int len,int *p1,int *p2){ int i = 0; int res = 0; int pos = 0; //記錄二進制位位1的位置 for(i = 0; i<len; i++) //將所有數進行異或 { res^=a[i]; } for(i = 0; i<32; i++) //找二進制位中任何位置是1的并記錄 { if(((res>>i)&1) == 1) { pos = i; break; } } for(i = 0; i<len; i++) { if(((a[i]>>pos) &1) ==1) { (*p1)^=a[i]; } } *p2 = res^(*p1); }int main(){ int a[10] = {1,1,2,4,4,5,5,3,6,6}; int len = sizeof(a)/sizeof(a[0]); int *ret1 = 0; int *ret2 = 0; Find(a,len,&ret1,&ret2); printf("%d/n",ret1); printf("%d/n",ret2); return 0;}
|
新聞熱點
疑難解答