给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例
输入: [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)