int singleNumber(int* nums, int numsSize) {
int a,b,i,j,c,label=0;
if(numsSize==1){
return nums[0];
}else{
for(i=0;i<numsSize;i++){
a=nums[i];
for(j=0;j<numsSize;j++){
b=nums[j];
if((a==b)&&(i!=j)){
break;
}
if((a!=b)&&(j==numsSize-1)){
c= a;
label=1;
break;
}
}
if(label==1){
break;
}
}
}
return c;
}
int main(){
int numsSize;
int nums[10];
int i,z;
scanf("%d",&numsSize);
for(i=0;i<numsSize;i++){
scanf("%d",&nums[i]);
}
z=singleNumber(nums,numsSize);
printf("%d",z);
getchar();
return z;
}
singer number i 我这个超时了,从测试用例【1】到【1,1,2】到【1,2,-1,2,1】慢慢调,终于调通了,但是超时了
看到正确答案ac后真的是惊奇这万千世界 竟然有方法可以顶替掉我这么多行的代码,师兄看我想了两天就说快去看看别人的方法把,你这样没用的
果然,惊奇之后是想吐,什么鬼,怎么能想的到
好了看一下这万能的XOR吧
int singleNumber(int* nums, int numsSize) {
int result=0;
int i;
for(i=0;i<numsSize;i++){
result^=nums[i];
}
return result;
}
原理就是这样的 (摘自http://www.powerxing.com/leetcode-single-number/)
因为A XOR A = 0,且XOR运算是可交换的,于是,对于实例{2,1,4,5,2,4,1}就会有这样的结果:
(2^1^4^5^2^4^1) => ((2^2)^(1^1)^(4^4)^(5)) => (0^0^0^5) => 5
就把只出现了一次的元素(其余元素均出现两次)给找出来了!