Java算法–第一章–位运算符(2)唯一成对的数
题目:1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,把它找出来;不用辅助存储空间,能否设计一个算法实现?
(写的代码过于粗糙,还有很多地方有待改善……)
代码:
package exer1;
import java.util.Random;
public class 唯一成对的数 {
public static void main(String[] args) {
int N = 6;
int[] arr = new int[N];
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = i + 1;
}
//随即最后一个数
arr[arr.length - 1] = new Random().nextInt(N - 1) + 1;
//随机下标
int index = new Random().nextInt(N);
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+" , ");
}
System.out.println();
int x1 = 0;
for (int i = 1; i <= N - 1; i++) {
x1 = x1 ^ i;
}
for (int i = 0; i < N; i++) {
x1 = x1 ^ arr[i];
}
System.out.println(x1);
}
}
输出:
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 9 ,
9
暴力破解:
package exer1;
import java.util.Random;
public class 唯一成对的数1 {
public static void main(String[] args) {
int N = 11;
int[] arr = new int[N];
for (int i = 0; i < arr.length - 1; i++) {
arr[i] = i + 1;
}
//随即最后一个数
arr[arr.length - 1] = new Random().nextInt(N - 1) + 1;
//随机下标
int index = new Random().nextInt(N);
for(int i = 0;i<arr.length;i++){
System.out.print(arr[i]+" , ");
}
System.out.println();
int[] help = new int[N];
for(int i = 0;i < N;i++){
help[arr[i]]++;
}
for(int i =0;i < N;i++){
if(help[i] == 2){
System.out.println(i);
break;
}
}
}
}
输出:
1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 3 ,
3