1,題目描述:在一個(gè)數(shù)組中有一個(gè)數(shù)出現(xiàn)了1次(奇數(shù)次),其余數(shù)都出現(xiàn)了2次(偶數(shù)次),找到這個(gè)數(shù)~
方法:異或運(yùn)算為基礎(chǔ) , 偶數(shù)個(gè)一樣的數(shù)異或?yàn)?, 異或符合交換律 ,所以只需要把所有數(shù)組中所有數(shù)字異或一次就可以了
void findChar1(int a[] ,int l ,int *x){//有一個(gè)出現(xiàn)一次或者奇數(shù)次的情況
int res = 0;
for (int i = 0 ; i < l; i++) {
res = res^a[i];
}
printf("%d",res);
*x = res;
}
2..題目描述:在一個(gè)數(shù)組中有兩個(gè)個(gè)數(shù)出現(xiàn)了1次(奇數(shù)次),其余數(shù)都出現(xiàn)了2次(偶數(shù)次),找到這兩個(gè)數(shù)~
方法:由于有兩個(gè)數(shù)字出現(xiàn)了奇數(shù)次,并且這兩個(gè)數(shù)字不同,所以將數(shù)組中每個(gè)數(shù)異或起來(lái)的結(jié)果不為0;并且若結(jié)果的某一位為1,則必然是因?yàn)閮蓚€(gè)數(shù)在這一位的值不同??紤]這一位,我們把數(shù)組中這一位為0和1的元素分別作異或運(yùn)算,則結(jié)果就分別為這兩個(gè)數(shù)的值。
void findChar2(int a[],int l , int *x , int *y){//有兩個(gè)出現(xiàn)一次/奇數(shù)次的情況
int res = 0;
for (int i = 0 ; i < l; i++) {
res = res^a[i];
}
int a1 = 0;
int a2 = 0;
int k = 0;
while ( res ){
if (res%2 == 1) {
for (int i = 0; i<l ; i++) {
if ((a[i] >> k)%2 == 1) {
a1 = a1 ^ a[i];
}else{
a2 = a2 ^ a[i];
}
}
break;
}
res = res >> 1;
k++;
}
*x = a1;
*y = a2;
}
3.題目描述:在一個(gè)數(shù)組中有三個(gè)數(shù)出現(xiàn)了1次(奇數(shù)次),其余數(shù)都出現(xiàn)了2次(偶數(shù)次),找到其中一個(gè)數(shù)~
方法:如果數(shù)都是成對(duì)出現(xiàn)的話(huà),那么在每一位上的異或結(jié)果都應(yīng)該是0,考慮3個(gè)數(shù)在某位上的值
3個(gè)0,3個(gè)1,兩個(gè)0一個(gè)1,一個(gè)0兩個(gè)1;依然采用題目2中的方法,將位數(shù)為0和1的分別異或,然后找到只有一個(gè)非成對(duì)出現(xiàn)數(shù)的異或結(jié)果,這個(gè)結(jié)果即為某一個(gè)非成對(duì)出現(xiàn)的數(shù)。由于3個(gè)數(shù)不相等所以必有兩個(gè)0一個(gè)1,一個(gè)0兩個(gè)1這種情況出現(xiàn)。
排除3個(gè)0或3個(gè)1的這種情況的方法,就是看另外的一個(gè)異或集是否為0,比如某一位為0的數(shù)組異或集不為0,而為1的數(shù)組異或集為0,則該位為1的異或集中肯定沒(méi)有非成對(duì)出現(xiàn)的元素。
void findChar3(int a[] , int l , int *x){ ////有三個(gè)出現(xiàn)一次/奇數(shù)次的情況找其中一個(gè)數(shù)
int res = 0;
for (int i = 0 ; i < l; i++) {
res = res^a[i];
}
int a1 = 0;
int a2 = 0;
int counta1 = 0;
int counta2 = 0;
int k = 0;
while ( res ){
for (int i = 0; i<l ; i++) {
if ((a[i] >> k)%2 == 1) {
counta1++;
a1 = a1 ^ a[i];
}else{
counta2++;
a2 = a2 ^ a[i];
}
if(counta1%2 == 1){
if (a2 != 0) {
*x = a1;
return;
}
}else {
if (a1 != 0) {
*x = a2;
return;
}
}
}
res = res >> 1;
k++;
}
}
如果需要找到全部的三個(gè)元素,那這個(gè)方法就不行了,必須采用另外的方法。
比如 如果三個(gè)元素為( 101,110,100 ) ,那么永遠(yuǎn)只能找到101和110這兩個(gè)數(shù)而找不到100....