/**
* 一个数组,有一个数出现3次,其余出现2次,求出现3次的数,要求时间复杂度<nlogn,空间复杂度O(1)
* @author Administrator
*
*/
public class FindSpecialNumInArray {
/**
* 一个数与自身异或结果为0;0与任何数异或结果不变;由此可知,出现两次的数异或后结果为0,出现3次的数,
* 异或后结果为该数,因此将数组所有的数进行异或,最后剩下的数就是出现3次的数,时间复杂度为o(n),
* 空间复杂度为O(1);此方法可以再出现偶数个数与奇数个数数组中找到出现奇数个的数;
* @param arr[]
* @return
*/
public int findSpecialNum(int[] arr){
int temp = 0;
for(int i=0;i<arr.length;i++){
temp ^= arr[i];
}
return temp;
}
}
@Test
public void findSpecialNumInArray(){
int[] arr = {15,56,89,25,71,83,99,22,55,15,56,89,25,99,71,83,22,55,55};
FindSpecialNumInArray fsna = new FindSpecialNumInArray();
System.out.println(fsna.findSpecialNum(arr));
}
类似的题目:在一个数组中除两个数字只出现1次外,其它数字都出现了2次,