1. 程式人生 > >第一個問題是給出2n+1個數,其中有n個數是成對出現的,讓我找出裡面只出現了一次的那個數。

第一個問題是給出2n+1個數,其中有n個數是成對出現的,讓我找出裡面只出現了一次的那個數。

題目

  1. 給你n個數,其中有且僅有一個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那一個數。
  2. 給你n個數,其中有且僅有兩個數出現了奇數次,其餘的數都出現了偶數次。用線性時間常數空間找出出現了奇數次的那兩個數。

答案

  1. 從頭到尾異或一遍,最後得到的那個數就是出現了奇數次的數。這是因為異或有一個神奇的性質:兩次異或同一個數,結果不變。再考慮到異或運算滿足交換律,先異或和後異或都是一樣的,因此這個演算法顯然正確。

  2. 從頭到尾異或一遍,你就得到了需要求的兩個數異或後的值。這兩個數顯然不相等,異或出來的結果不為0。我們可以據此找出兩個數的二進位制表達中不同的一位,然後把所有這n個數分成兩類,在那一位上是0的分成一類,在那一位上是1的分到另一類。對每一類分別使用前一個問題的演算法。

確實是很牛的演算法,特別是第二個