回覆列表
-
1 # 使用者2885548583173
-
2 # 範閒不是我
#include
union uu{
int x;
unsigned char c[4];
} u;
main()
{
int x = 12345678;
unsigned char s[4];
int i;
u.x = x ;
for (i=0;i
for (i=0;i
printf("\n");
for (i=0;i
x = u.x;
printf("%d\n",x);
}
讓我們簡化一下這個問題:有 2k+1 個整數,除一個以外均恰好出現兩次。經典做法是,將此 2k+1 個整數全部異或(xor)起來。由於 xor 的性質:A xor A = 0, A xor B = B xor A, A xor 0 = A,易證明最終結果就是隻出現一次的那個數。回到原問題,我們需要構造一種「四數相消」的異或運算。異或的本質其實是,對於每一個二進位制位進行模 2 加法運算。所以此問題只需要改模 2 為模 4 即可(最後將結果除以 2)。例:[3, 5, 2, 5, 3, 2, 5, 5, 3, 3]二進位制位:011101010101011010101101011011模 4 加法:020每位除 2,化為十進位制:010 => 2時間複雜度 O(n * 位數),額外空間 O(1)。