目录
算法思路:
-
使用辅助空间
-
找出已知数组arr中最大的数num
-
创建一个大小为num+1的数组array,初值全为0
-
循环arr,在下标为arr[i]的数组array的值自增,即array[arr[i]++]
-
找出array[i]值为2的下标,i就是唯一出现两次的数
- 使用位运算(此方法只适用知道已知数组的所有值,例题,在长度为11的数组里存放0~9,只有一个数出现两次,求出现两次的数 )
- 利用位运算符^的性质:两个相同的数异或的值为0。
- 最初是一个数出现两次,其他数出现一次
- 再异或一遍数组的所有值,例如异或0~9
- 这时候,就变成了,一个数出现了3次,其他数出现了两次,这时候做异或就能把其他数全部消掉。
代码实现:(Java)
//不知道数组由哪些数组成
public void FindTheOnlyTimeNumberThatAppearsTwice1(int arr[]) {
if(arr==null)
return ;
int max=arr[0];
for(int i=1; i<arr.length; i++) {
if(max<arr[i]) {
max=arr[i];
}
}
int array[]=new int[max+1];
for(int i=0; i<arr.length; i++) {
array[arr[i]]++;
if(array[arr[i]]==2) {
System.out.println(arr[i]);
break;
}
}
}
//知道数组由哪些数组成
//例如arr[11]由0~9组成,只有一个数出现两次,其他数只出现一次
//使用位运算,两个相同的数做异或会抵消
public void FindTheOnlyTimeNumberThatAppearsTwice2(int arr[]) {
int a=0;
for(int i=0; i<arr.length; i++) {
a^=arr[i];
}
for(int i=0; i<=9; i++) {
a^=i;
}
System.out.println(a);
}