力扣 136. 只出現一次的數字
阿新 • • 發佈:2021-01-15
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例
輸入: [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)