Given a non-empty 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?
Example 1:
Input: [2,2,1] Output: 1
Example 2:
Input: [4,1,2,1,2] Output: 4
题意:给出一个数字数组,数组中有且仅有一个元素出现了一次,其余都出现了两次。求出这个只出现了一次的元素。
思路一:使用stl自带的map映射,记录每个元素出现的次数,然后再遍历map,求出值为1的位置即可。在这里,我使用了c++ 11新有的unordered_map,其内部基于hash实现,在查找时拥有更好的效率。
class Solution {
public:
unordered_map<int,int>mp;
int singleNumber(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
if(mp.count(nums[i])==0)
mp[nums[i]]=1;
else mp[nums[i]]++;
}
for(auto i:mp){ // 使用auto遍历mp即可。这里i.first为mp中的键,i.second为mp的值
if(i.second==1) return i.first;
}
return 0;
}
};
思路二:使用异或。有x^x=0,即某个数字与其本身异或后值为0。将所有元素都进行异或后的结果即为只出现了一次的元素。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans=0;
for(int i=0;i<nums.size();i++){
ans=ans^nums[i];
}
return ans;
}
};