136.Single Number I

来源:互联网 发布:多益网络账号找回 编辑:程序博客网 时间:2024/04/29 14:45

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

就把只出现了一次的元素(其余元素均出现两次)给找出来了!


0 0