一道讓你拍案叫絕的算法題

這是一道看完答案會以爲很簡單,但作以前很難想到答案的題目!!!算法

不信?數組

Let us go !數據結構

題目描述

給定一個非空整數數組,除了某個元素只出現一次之外,其他每一個元素均出現兩次。找出那個只出現了一次的元素。動畫

說明:

你的算法應該具備線性時間複雜度。 你能夠不使用額外空間來實現嗎?code

示例 1:

輸入: [2,2,1]
輸出: 1cdn

示例 2:

輸入: [4,1,2,1,2]
輸出: 4blog

題目解析

根據題目描述,因爲加上了時間複雜度必須是O(n),而且空間複雜度爲O(1)的條件,所以不能用排序方法,也不能使用map數據結構。排序

小吳想了一下午沒想出來,答案是使用 位操做Bit Operation 來解此題。內存

將全部元素作異或運算,即a[1] ⊕ a[2] ⊕ a[3] ⊕ …⊕ a[n],所得的結果就是那個只出現一次的數字,時間複雜度爲O(n)。leetcode

異或

異或運算A ⊕ B的真值表以下:

A B
F F F
F T T
T F T
T T F

動畫演示

進階版

有一個 n 個元素的數組,除了兩個數只出現一次外,其他元素都出現兩次,讓你找出這兩個只出現一次的數分別是幾,要求時間複雜度爲 O(n) 且再開闢的內存空間固定(與 n 無關)。

示例 :

輸入: [1,2,2,1,3,4]
輸出: [3,4]

題目再解析

根據前面找一個不一樣數的思路算法,在這裏把全部元素都異或,那麼獲得的結果就是那兩個只出現一次的元素異或的結果。

而後,由於這兩個只出現一次的元素必定是不相同的,因此這兩個元素的二進制形式確定至少有某一位是不一樣的,即一個爲 0 ,另外一個爲 1 ,如今須要找到這一位。

根據異或的性質 任何一個數字異或它本身都等於 0,獲得這個數字二進制形式中任意一個爲 1 的位都是咱們要找的那一位。

再而後,以這一位是 1 仍是 0 爲標準,將數組的 n 個元素分紅兩部分。

  • 將這一位爲 0 的全部元素作異或,得出的數就是隻出現一次的數中的一個

  • 將這一位爲 1 的全部元素作異或,得出的數就是隻出現一次的數中的另外一個。

這樣就解出題目。忽略尋找不一樣位的過程,總共遍歷數組兩次,時間複雜度爲O(n)。

動畫再演示

End

本題的基礎版來源於 LeetCode 第 136 號問題:只出現一次的數字。雖然題目難度是 簡單,但解法真的很巧妙。感興趣的同窗能夠根據思路去回答一下:leetcode-cn.com/problems/si…

相關文章
相關標籤/搜索