给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
本题,最简单的思路就是用一个map将所有nums数组的元素放进去,出现两次的value值设为2,一次的为1,然后遍历map就可以了,通过是能通过,就是性能…只能用拉胯来形容。
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int,int> list;
for(int n:nums)
{
if(list.count(n))
list[n]=2;
else
list[n]=1;
}
for(auto &iter:list)
{
if(iter.second==1)
return iter.first;
}
return 0;
}
};
其实可以使用亦或运算来做,因为:
- 任何数和0亦或都等于该数
- 两个相等的数亦或等于0
- 异或运算满足交换律和结合律
所以可以这么做:
因为只有一个数出现一次,其他数都是出现两次,所以将所有数进行亦或计算,出现两次的都等于0,然后0与出现一次的数进行计算,结果就是只出现一次的数。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res=0;
for(auto n:nums)
res^=n;
return res;
}
};