数组中找出唯一重复的数-例题1
我感觉看注释即可,解释都在注释中
package 找出唯一成对的数;
import java.util.Random;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-22-19-38
* 题目:
* 1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值
* 重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找
* 出来;不用辅助存储空间,能否设计一个算法实现?
* 重点是:
* 1.每个元素只能访问1次
* 2.不用辅助存储空间
* 条件:
* 存1-1000的数哦
*/
public class Demo {
public static void main(String[] args){
//这里用11来模拟1001个空间其实大概是一样的
int N = 11;
//开辟出对应的数组空间来
int[] arr = new int[N];
//给空间的0-9下标赋值1-10来模拟0-999下标赋值1-1000
for(int i = 0;i<arr.length-1;i++){
arr[i]=i+1;
}
//最后一个数,是随机数 赋值给下标10 后边的随机数讲解:先是N-1:0-9;在+1-》1-10 是对的
arr[arr.length-1] = new Random().nextInt(N-1)+1;
//打印下随机数
System.out.println("随机数为:"+arr[arr.length-1]);
//随机下标
int index = new Random().nextInt(N);//0-10
//交换随机数与随机下标做对应的值
int target = 0;//第三方
target = arr[index];//
arr[index] = arr[arr.length-1];
arr[arr.length-1]=target;
//打印这个数组
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
//打印完换下行
System.out.println();
int x1 = 0;//打算用这个异或,因为0异或任何数都为其本身
//下边将1-10这几个数连续异或:1^2^3...^9^10
for(int i = 1;i<=N-1;i++){
x1 = (x1^i);
}
int x2 = 0;//与x1是一个意思
//下边我们将数组中的各个数异或一下:因为有两个重复的 而两个重复的异或是0,0在异或别的不影响别的 所以就是少了这两个重复数的异或结果
for (int i = 0; i < N; i++) {
x2 = x2^arr[i];
}
//然后让x2与x1再异或 这样重复的那个数为单数,而那些别的不重复的书会变成双数(也就是变重复了)再异或九尾0了,所以x1^x2就是那个重复的数
int x3 = x1^x2;
//打印这个重复的数
System.out.println("重复的数为:"+x3);
System.out.println("===========下边用第二种暴力破解法来解(需开辅助空间)=========");
int[] helper = new int[N];//辅助空间
//下边是将arr[i]中的值作为helper的下标存入helper数组,存一次加一次1,这样重复的那个数的下标就为2
for (int i = 0; i < arr.length; i++) {
helper[arr[i]]++;
}
//去找这个重复的数
for (int i = 0; i < arr.length; i++) {
if(helper[i]==2){
//下标几位重复值,打印它
System.out.println("重复的值为:"+i);
break;
}
}
}
}
运行结果
完~