******位运算系列之数组中只出现一次的数字******
//题目(1):在一个数组中只有一个数字出现一次,其他数字都是成对出现的!让你找出这个只出现一次的数字,
//其实,这也叫缺失的数字,用来找成对数组中里有一对数字缺失了一个数字的数组成员!
//其实,这也叫缺失的数字,用来找成对数组中里有一对数字缺失了一个数字的数组成员!
/*
那么,现在先来分析一下,一般情况下,我们最先想到的方法就是统计一下数组中每个成员出现的次数,然后
找出那个只出现了一次的数字,不可否认的是方法是可行的,可是效率问题就出来了,这种方法的时间复杂度
是O(n^2);看来并不是解决问题的最佳方案,还有同学会提出可以先将数组排序,然后比较相邻两个数是否相同
,可以找出这个单独出现一次的数,可是考虑一下排序的时间复杂度,显然也不是最优方案,这两种解决方法
大家可以自己试一试,才能感觉到不同!
找出那个只出现了一次的数字,不可否认的是方法是可行的,可是效率问题就出来了,这种方法的时间复杂度
是O(n^2);看来并不是解决问题的最佳方案,还有同学会提出可以先将数组排序,然后比较相邻两个数是否相同
,可以找出这个单独出现一次的数,可是考虑一下排序的时间复杂度,显然也不是最优方案,这两种解决方法
大家可以自己试一试,才能感觉到不同!
那么,想想我们知道的位操作符,想想用二进制是否可以解决这个问题;
1.) 先回忆一下异或运算符的作用,(^) 处理二进制中两个数的异或时,相同为0,相异为1,异或还有交换的作用;
那么我们假设数组是{2,3,2,4,4},数组中成对的成员不一定是在一起的,我们先把他们的二进制列出来:
@我就不把32位都列出来了!
那么我们假设数组是{2,3,2,4,4},数组中成对的成员不一定是在一起的,我们先把他们的二进制列出来:
@我就不把32位都列出来了!
2:0010
3:0011
2:0010
4:0100
4:0100
3:0011
2:0010
4:0100
4:0100
既然相同位异或为0,那么让数组中的全部元素异或后的结果不就是那个单独出现一次的数字了&#x