面試題40 陣列中只出現一次的數字

2021-07-02 02:55:14 字數 1371 閱讀 4114

參考:

1.2.

題目:乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。

需要用到的知識:位運算的異或操作^

1.按位異或運算定義:

1 ^ 1=0

1 ^ 0=1

0 ^ 1=1

0 ^ 0=0

2.規律

定理一a ^ b = b ^ a

定理二 a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;

定理三 a ^ b ^ a = b, a ^ a^ b = b, b ^ a^ a = b

定理四若d = a ^ b ^ c,則a = d ^ b ^ c

演算法思路:根據異或運算的性質,任何乙個數字異或它自己都等於0。

例如1^1=0,根據定理4可以知道0^1=1

所以,如果乙個陣列中只存在乙個出現一次的數字,其他數字都出現兩次,根據定理三可將所有相同的數字移到一塊,然後進行異或運算,相同的兩個數字異或得                         0,最後只剩下出現一次的那個數字。

例如例如,對陣列內的數字進行位運算,1^2^3^4^1^2^3=1^1^2^2^3^3^4→0^0^0^4=4,最後結果為4,就是只出現一次的那個數字。

根據以上思路,當陣列中有兩個元素出現一次的時候,例如

1.同樣對陣列中的數字進行異或運算,2^4^3^6^3^2^5^5=2^2^3^3^5^5^4^6=4^6

2.4的二進位制後四位0100,6的二進位制後四位為0110,所以4^6=0010,從結果可以看出4和6的二進位制表示中倒數第二位不一樣(倒數第二位為1),因為一樣的進行異或操作結果為0,所以在這一步要找出第一步結果中倒數第幾位為1的那個位置記做k,即第k位為1,此處k=2

3.根據第k(k=2)位可以將原陣列劃分為兩個陣列,第乙個陣列中數字的第k位都為1,第二個陣列中第k為都為0,中所有數字的倒數第k(k=2)位都是1,中所有數字的倒數第k位都為0

4.分開的兩個陣列中每個陣列中只出現一次的數字就變為1個,然後對兩個陣列再次進行異或運算,出現兩次的數字都變為0,兩個陣列中最後得到的結果就是要求的兩個數字。

public class onlyoncetest ;

onlyonceinaarry(data);

}public static void onlyonceinaarry(int data)

return pos; }

//判斷二進位制的pos位置是否為1

public static int isoneinpos(int number,int pos)

}

面試題40 陣列中只出現一次的數字

題目描述 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。解題思路 若是陣列中只有乙個數字出現一次,其餘的數字都出現偶數次,那麼直接將陣列中所有的數進行異或運算,得到的最後的結果就是出現一次的數 出現奇數次的數字 但是,題目要求是有兩個數出現一次,那麼上述...

面試題40 陣列中只出現一次的數字

題目 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。這其實是除了有乙個數字外,其它數字都出現兩次的變種。只有乙個數字不同的時候,可以採用異或來做。但此處是兩個不同。書上給出的方法是先異或,得到結果值。然後在結果中,從右往左找到第一位是1的位號。由此考慮將...

面試題40 陣列中只出現一次的數字

1.乙個陣列中除了兩個數字之外,其他的式數字都出現了兩次。找出這個兩個只出現一次的數字,要求時間複雜度是o n 空間複雜度是o 1 分析 這種題目剛開始很難相處滿足條件的要求,要求在o n 的時間複雜度還是比較高的,可以先假設陣列中只有乙個數字出現了一次,其他的數字都出現了兩次,如果是這種情況,可以...