暴力解超时了,代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len=nums.size();
int *flag=new int[len];
int result=8;
memset(flag,0,len);
for(int i=0;i<len-1;i++){
for(int j=i+1;j<len;j++){
if(nums[i]==nums[j]){
flag[i]=1;
flag[j]=1;
}
}
}
for(int k=0;k<len;k++){
if(flag[k]!=1){
result=nums[k];
}
}
return result;
}
};// An highlighted block
var foo = 'bar';
看了官方题解用的异或方法:
1⊕ 1=0***
1⊕ 0=1
0⊕ 1=1
0⊕ 0=0***
所以任何数和 0 做异或运算,结果仍然是原来的数,即 a ⊕ 0=a
任何数和其自身做异或运算,结果是 00,即 a ⊕ a=0。***
异或运算满足交换律和结合律,即 a ⊕ b ⊕ a = b ⊕ a ⊕ a = b ⊕ (a ⊕ a)= b ⊕ 0 = b
任何数和其自身做异或运算,结果是 00,即 a ⊕ a=0。
因为异或运算满足交换律,所以可以把相同的放在一起运算变成零,最后会剩下只出现一次的数字与0异或,结果也是只出现一次的数字。
异或代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int len=nums.size();
int result=0;
for(int i=0;i<len;i++){
result^=nums[i];//^是异或符号
}
return result;
}
};