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

136.只出現一次的數字

題目


給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

示例 1:
輸入: [2,2,1]
輸出: 1

示例 2:
輸入: [4,1,2,1,2]
輸出: 4

解題思路


  • 不用額外空間,考慮位運算
  • 異或:
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for (auto e: nums) ret ^= e;
        return ret;
    }
};
  • 記錄一個很好的思路:
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();
}

//https://leetcode-cn.com/problems/single-number/solution/cou-yi-pian-ti-jie-hua-shuo-ti-jie-hen-hao-wan-by-/