Single Number(单一的数字)
【难度:Medium】
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
给定一整数数组,除了唯一的一个数之外其他的数字均出现两次,找到这个数字。时间复杂度限制为O(n),能否不使用额外空间来完成?
解题思路
根据题意很容易想到的一个方法就是统计每个数字出现的次数,然后在统计的结果中找到次数为1的数字。但是这种方法在样例很大时会超时。
然后我们知道异或(XOR)基本运算性质:
a^a = 0,a^0 = a, a^b^a = a^a^b = 0^b = b
那么解法显而易见了:一趟遍历,将所有数字进行异或,最后结果就是单一的数字。
C++代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int i = 0; i < nums.size(); i++)
ans ^= nums[i];
return ans;
}
};
还有一种解法是使用数据结构set,由于set自带去重功能,那么在nums[i]时,若在set中不存在,则insert;若已存在,则remove。最后set中只剩下单一的数字。该方法耗时较高因为涉及到了查找方面。
C++代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
set<int> ans;
for(int i = 0;i < nums.size();++i){
if(ans.find(nums[i]) == ans.end()) ans.insert(nums[i]);
else ans.erase(nums[i]);
}
auto it = ans.begin();
return *it;
}
};