rtc校準演算法 一道讓你拍案叫絕的演算法題

2021-10-18 17:14:11 字數 1357 閱讀 3189

這是一道看完答案會覺得很簡單,但做之前很難想到答案的題目!!!

不信?let us go !

題目描述

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]

輸出: 1

示例 2:

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

輸出: 4

題目解析

根據題目描述,由於加上了時間複雜度必須是o(n),並且空間複雜度為o(1)的條件,因此不能用排序方法,也不能使用map資料結構。

小吳想了一下午沒想出來,答案是使用 位操作bit operation 來解此題。

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

異或異或運算a ⊕ b的真值表如下:

ab⊕fff

fttt

fttt

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 的演算法題.超時了,要換方法.題目 兩數之和 注意題目要求 返回 0,1 這種形式的。暴力法求解兩數之和 當陣列內的元素過多時,該演算法執行超時。給定乙個整數陣列和乙個目標值,找出陣列中和為目標值的兩個數。deftwosum nums,target l len nums f...

一道有趣的演算法題

日前在網上看到一道演算法題。頗有意思,也細細的研究一番。現將該題發布於此,和各位交流一下。同時,本文也是筆者首次使用office2007的部落格功能,看看效果怎麼樣。某幢大樓有100層。你手裡有兩顆一模一樣的玻璃珠。當你拿著玻璃珠在某一層往下扔的時候,一定會有兩個結果,玻璃珠碎了或者沒碎。這幢大樓有...

聽來的一道演算法題目

今天在公司,聽到同事在討論一道演算法題 現有乙個函式可以得到1 5的隨機數,求如何利用該函式得到1 7的隨機數 本人的方法是 因為5的二進位制表示為101,7的二進位制表示為111 這樣每次隨機生成1 5,然後取其二進位制的最低位,然後隨機三次,組合,得到,即能隨機得到1 7 而聽同事們講的是 取模...