找出陣列中只出現一次的數字
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
如果沒有時間複雜度和空間複雜度的限制,可以使用集合儲存數字。遍歷陣列中的每個數字,如果集合中沒有該數字,則將該數字加入集合,如果集合中已經有該數字,則將該數字從集合中刪除,最後剩下的數字就是隻出現一次的數字。
Java程式碼如下:
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet< Integer>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])){
//已經存在,從集合中刪除
set.remove(nums[i]);
}
else set.add(nums[i]);
}
return set.iterator().next();
}
上述解法需要額外使用 O(n)的空間,其中 n 是陣列長度。如果要求使用線性時間複雜度和常數空間複雜度,上述解法顯然不滿足要求。那麼,如何才能做到線性時間複雜度和常數空間複雜度呢?
答案是使用位運算。對於這道題,可使用異或運算 ⊕。異或運算有以下三個性質。
任何數和 0 做異或運算,結果仍然是原來的數,即 a⊕0=a。
任何數和其自身做異或運算,結果是 0,即 a⊕a=0。
異或運算滿足交換律和結合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
因此,陣列中的全部元素的異或運算結果即為陣列中只出現一次的數字。
Java程式碼如下:
public int singleNumber(int[] nums) {
int single = 0;
for (int i:nums)
single ^= i;
return single;
}
複雜度分析
時間複雜度:O(n),其中 nnn 是陣列長度。只需要對陣列遍歷一次。
空間複雜度:O(1)。
相關文章
- JZ-040-陣列中只出現一次的數字陣列
- 劍指offer 陣列中只出現一次的數字陣列
- 《劍指offer》:[40]陣列中只出現一次的數字陣列
- 【劍指offer】陣列中只出現一次的數字(1)陣列
- 【劍指offer】陣列中只出現一次的數字(2)陣列
- 找出陣列中第 k 大的數字及其出現次數陣列
- 只出現一次的數字 II
- 在其它數都出現k次的陣列中找到只出現一次的數陣列
- 136. 只出現一次的數字
- 給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。陣列
- LeetCode 只出現一次的數字LeetCode
- 統計陣列中各數字(元素)出現的次數陣列
- 計算陣列中每個數字出現的次數陣列
- LeetCode 只出現一次的數字IILeetCode
- LeetCode 只出現一次的數字IIILeetCode
- 【陣列】1394. 找出陣列中的幸運數(簡單)陣列
- LeetCode之只出現一次的數字-SwiftLeetCodeSwift
- LeetCode136 只出現一次的數字LeetCode
- 找出陣列中元素出現次數超過陣列長度一半的元素陣列
- 陣列中每個陣列元素出現的次數陣列
- Matlab 統計陣列中各數字(元素)出現的次數Matlab陣列
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- leetcode136. 只出現一次數字LeetCode
- js找出陣列中出現最多的元素和次數JS陣列
- leetcode力扣136.只出現一次的數字LeetCode力扣
- 陣列中重複的數字陣列
- Single Number 陣列中除了某個元素出現一次,其他都出現兩次,找出這個元素陣列
- LeetCode每日一題:只出現一次的數字(No.136)LeetCode每日一題
- 每日一題(一):找出兩個陣列中共有的數字每日一題陣列
- Matlab tabulate統計數字出現的次數,如果陣列中出現0Matlab陣列
- 統計陣列中各元素出現次數陣列
- 從陣列中找出N個數,其和為M的所有可能陣列
- 一個整型陣列裡除了一個或者兩個或者三個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)陣列時間複雜度
- Leetcode 137:只出現一次的數字 II(最詳細的解法!!!)LeetCode
- 在陣列中找出唯一的重複元素陣列
- 找出陣列中元素的位置陣列
- 統計陣列元素中每個元素出現的次數陣列
- 求一個陣列中沒有出現的最小正數陣列