題目:
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]示例 2:輸出: 1
輸入: [4,1,2,1,2]輸出: 4
審題:除了某個元素只出現一次以外,其餘每個元素均出現兩次。1、線性時間複雜度:要求我們的**時間複雜度最高為o(n),不能有巢狀迴圈等。
2、不使用額外空間:要求空間複雜度最高為o(1)。
解題:方法一:(異或法)
完美思路:根據異或運算的特點,相同的數字經過異或運算後結果為0,除了單獨出現一次的數字外,其他數字都是出現兩次的,那麼這些數字經過異或運算後結果一定為0。而任何數字與0異或運算都是該數字本身。所以對陣列所有元素進行異或運算,運算結果就是題目的答案。
還有重要的一點就是:a ⊕ b ⊕ a = b.
上**:
1class
solution
7return
num;
8}
9 }
方法二:(比較法) 思路:先對陣列進行排序,然後對nums[i]和nums[i+1]進行比較,如相等,i += 2,繼續下一組比較,知道取到不想等的一組。注意:首先這個陣列的長度肯定是奇數(目標數字只出現一次,其他所有數字出現兩次),所以如果上述步驟沒有找到不相等的一組數,那麼肯定是陣列的最後乙個數字是單獨出現的。
**如下:
classsolution
}return nums[nums.length-1];
}}
這種方法由於使用了arrays.sot(int a)方法,時間複雜度是o(n3),不符合線性時間複雜度。
只出現一次的數字
1.乙個整型陣列,有乙個數字出現一次,其餘數字出現兩次,找出這個只出現一次的數字。解題思路 異或運算性質 兩個相同的數字異或得0,0與乙個數字異或得數字本身,而且異或運算是滿足交換律的 陣列元素按位異或,交換律可以想象成相同的數字參與運算的時候是相鄰的 所有出現兩次的數字異或之後得0,最後剩餘的是0...
只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1示例 2 輸入 4,1,2,1,2 輸出 4核心思想 對list排序,然後遍歷 class ...
只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素 例 1,2,2 1 方法一 異或 數字1 數字2 每一位如果相同就為0,不同為1 1 1 0 1 0 1 0 1 1 0 0 0 class solution def singlenumber se...