例:
输入: [2,2,1] 输出: 1
解1:异或
class Solution {
public:
int singleNumber(vector<int>& nums) {
int num = 0;
for(int i = 0; i < nums.size(); ++i)
num = num^nums[i];
return num;
}
};
解析:
Q1:^什么意思?
A1:异或运算符,将int十进制数转换为二进制,运算符两边数字对应0和1对比,若两边数字相反(0、1)则对应位结果为1,否则为0.
Q2:为什么用异或运算符?
A2:nums中存放了所有数字,开始num原来是0与第一个数字异或,结果为nums[0],若一个数与自己异或,则结果为0,所以最后结果一定是只有一次出现的元素。
解2:set集合
class Solution {
public:
int singleNumber(vector<int>& nums) {
set<int> x;
for(int i : nums){
if(x.insert(i).second == false){
x.erase(i);
}
}
return (*x.begin());
}
};
Q1:为什么set不能用下标访问元素?
A1:因为set用的是链表,不是数组,不是顺序存放元素。
set特点是元素不能重复,所以去插入的时候,重复元素不能被插进去,然后没插进去的元素在vector里删除,剩下的就是唯一的元素了。