1. 程式人生 > 其它 >力扣 136. 只出現一次的數字

力扣 136. 只出現一次的數字

技術標籤:位運算雜湊表leetcode演算法

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

說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例
輸入: [4,1,2,1,2]
輸出: 4

法一:雜湊表
時間複雜度O(n)
空間複雜度O(n)

法二:set
時間複雜度O(n)
空間複雜度O(n)
C#程式碼

public static int SingleNumber(int[] nums)
{
    HashSet<int> set = new HashSet<int>()
; for (int i = 0; i < nums.Length; i++) { //該判斷語句的整體作用是:如果當前數字(nums[i])已經在之前出現過,那麼在雜湊集例項(set)中移除當前數字 // Add 方法的作用是添加當前數字於雜湊集中,如果當前數字和該集合(set)元素存在重複,則返回 False 。故在此採用了邏輯非操作符(!) if (!set.Add(nums[i])) set.Remove(nums[i]); ; } //因為每個重複元素最多存在兩個,而重複元素的第一個新增後均被移除,而第二個均未新增成功,故此時雜湊集只保留唯一且未重複的元素
// First*1 方法的作用是返回該序列的第一個元素 return set.First(); }

法三:異或
二進位制中
兩數相同得0
兩數不同得1
a^a = 0 (a可以時任何數)
0^a = a (0異或任何值得到的結果是他本身)
XOR異或滿足交換率結合律

程式碼如下:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
       int ans = 0;
       for(auto num : nums)
        ans ^= num;
        return
ans; } };

時間複雜度O(n)
空間複雜度O(1)