原題:
乙個陣列中只有兩個數字是出現一次,其他所有數字都出現了兩次。
找出這兩個只出現一次的數字,程式設計實現。
此題要用到在數列中找出只出現一次的乙個數字的方法
參考此題明顯無法一次性將兩個數都找出,所以需要將數列分為兩部分,每一部分有乙個只出現一次的數,那麼此時需要的就是分離數列的條件。
沿用找出乙個數時的思想,將數列進行相互異或,但這次所得的值不是只出現一次的那個數了,因為只出現一次的數有兩個,所以此次計算得到的是只出現一次的兩個數的異或值。
在得到這個值後進行分析,假如得到值是4,二進位製碼是0100
參照異或的定義,0代表此位兩個數的值相同,1代表此位兩個數的值不同。
eg:只出現一次的兩個數是2和6
2的二進位製碼是
0010
6的是0110
計算得到的值(兩個數異或)就是0100,表示第三個二進位制位兩個數不同
得到了此條件,就可以將數列分為第三個二進位制位為1和第三個二進位制位為0兩個數列
再將每個數列採用找出乙個數字的方法找出數字即可。
源**:
#define _crt_secure_no_warnings 1
#include#includeint find1(int a,int length)
return result;
}void find2(int result,int a, int length, int *k1, int *k2)
for (j = 0; j < length; j++)
if (((a[j] >> i) & 1 )== 0)
}}int main()
; int length = sizeof(arr) / sizeof(arr[0]);
int num1=0, num2=0;
int * k1 = &num1, * k2 = &num2;
find2(find1(arr, length), arr, length, k1, k2);
printf("%d %d\n",num1,num2);
system("pause");
return 0;
}
找出只出現一次的整數
問題 乙個整數陣列中每個數均出現三次,只有乙個數隻出現一次。找出這個數。解析 如果這裡的數不是出現三次而是出現兩次,我們可以使用異或的方式將所有的數進行異或,最後的結果自然是僅出現一次的數。受此啟發,這裡考慮將整數表達成3 進製,每一位的異或操作 1 xo 0 1 2 xo 0 2 0 xo 0 0...
找出陣列中只出現一次的數字
乙個整型陣列裡除了乙個數字以外,其他數字都出現了兩次。找出這個只出現一次的數字 異或運算 任何乙個數字異或它本身都等於0,如果從頭到尾異或陣列中的每乙個數字,那些出現兩次的數字全部在異或中會被抵消,最終的結果剛好是這個只出現一次的數字 package jbarray 找出陣列中只出現一次的數字 au...
找出陣列中只出現一次的數
今天來看一道有意思的題,看起來很簡單,但是要想到滿足要求的答案沒那麼容易。有乙個非空整形陣列,除了有乙個只出現過一次的數,其他的數都出現且只出現過兩次,現要求找出這個只出現過一次的數。時間複雜度不能超過 o n 而且不能使用額外空間。大概意思就是,比如從 5,5,8,8,6,9,9 陣列中找出 6 ...