给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路一:
采用hashmap,遍历一次数组,保存每个数字出现的次数,最后找见出现次数为1的数
AC代码:(C++)
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> mp;
int ans;
int size = nums.size();
for (int i = 0; i < size; i++) {
if (mp.find(nums[i]) != mp.end())
mp[nums[i]]++;
else
mp[nums[i]] = 1;
}
for (unordered_map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {
if (it->second == 1) ans = it->first;
}
return ans;
}
};
思路二:
位运算
规则:一个数和自已异或为0,一个数和0异或为0.
采用位运算可以消除相同的数,最后只留下一个出现过一次的数。
如题目中样例4,1,2,1,2,令ans初始为0,分别进行异或运算。
1)0^4=0000⊕0100=0100=4
2)4^1=0100⊕0001=0101=5
3)5^2=0101⊕0010=0111=7
4)7^1=0111⊕0001=0110=6
5)6^2=0110⊕0010=0100=4
即最终答案为4
可以理解为对于10进制整型,异或一个与自己不相同的数代表加上这个数,异或一个与自己相同的数代表减去这个数。
AC代码:(C++)
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for (int num : nums) {
ans ^= num;
}
return ans;
}
};