single number(只出现一次的数字)
描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
哈希
用一个哈希表,遍历数组时,若当前元素不在哈希表中,则如哈希表,若已经在哈希表中了,则不是该元素,将该元素从哈希表中删除,哈希表中剩下的最后一个元素就是只出现一次的数字。
class Solution {
public:
int singleNumber(vector<int>& nums) {
map<int, bool> hash;
for(auto i : nums)
{
if(hash.find(i) != hash.end())
hash.erase(i);
else
hash[i] = true;
}
return hash.begin()->first;
}
};
异或
- a ^ 0 = a
- a ^ a = 0
- a ^ b ^ c = a ^ (b ^ c)
所以可以这么理解,所有有两个相同数组的异或后结果都为0,只剩下那一个数组和0异或。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int a = 0;
int len = nums.size();
for(int i=0; i<len; i++)
{
a ^= nums[i];
}
return a;
}
};
只出现一次的数组2
描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
哈希
还是可以用上面的哈希表来做,并且可以通过。
class Solution {
public:
int singleNumber(vector<int>& nums) {
map<int, int> hash;
int len = nums.size();
for(int i=0; i<len; i++)
{
if(hash.find(nums[i]) != hash.end())
hash[nums[i]]++;
else
hash[nums[i]] = 1;
}
int i = 0;
for(i=0; i<len; i++)
{
if(hash[nums[i]] == 1)
break;
}
return nums[i];
}
};