找出陣列中只出現一次的數字
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 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-陣列中只出現一次的數字陣列
- 找出陣列中第 k 大的數字及其出現次數陣列
- LeetCode 只出現一次的數字LeetCode
- 136只出現一次的數字
- 只出現一次的數字 II
- 在其它數都出現k次的陣列中找到只出現一次的數陣列
- LeetCode 只出現一次的數字IIILeetCode
- LeetCode 只出現一次的數字IILeetCode
- 136. 只出現一次的數字
- 只出現一次的數字--力扣力扣
- 給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。陣列
- LeetCode之只出現一次的數字-SwiftLeetCodeSwift
- LeetCode136 只出現一次的數字LeetCode
- leetcode136. 只出現一次數字LeetCode
- 統計陣列中各數字(元素)出現的次數陣列
- 【陣列】1394. 找出陣列中的幸運數(簡單)陣列
- 力扣136.只出現一次的數字力扣
- 找出陣列中元素出現次數超過陣列長度一半的元素陣列
- Matlab 統計陣列中各數字(元素)出現的次數Matlab陣列
- 陣列中每個陣列元素出現的次數陣列
- leetcode力扣136.只出現一次的數字LeetCode力扣
- 劍指 Offer 56 - I. 陣列中數字出現的次數陣列
- js找出陣列中出現最多的元素和次數JS陣列
- LeetCode每日一題:只出現一次的數字(No.136)LeetCode每日一題
- Leetcode 137:只出現一次的數字 II(最詳細的解法!!!)LeetCode
- 陣列中重複的數字陣列
- 每日一題(一):找出兩個陣列中共有的數字每日一題陣列
- Matlab tabulate統計數字出現的次數,如果陣列中出現0Matlab陣列
- 從陣列中找出N個數,其和為M的所有可能陣列
- LeetCode 136. 只出現一次的數字【c++/java詳細題解】LeetCodeC++Java
- 找出文字中每個字母出現的次數
- 統計陣列元素中每個元素出現的次數陣列
- 找到陣列中出現特定次數數字的問題陣列
- 448. 找到所有陣列中消失的數字陣列
- JZ-050-陣列中重複的數字陣列
- 查詢陣列中出現次數大於陣列長度一半的數字陣列
- LC-出現一次的數字II
- 第一次只出現一次的字元字元