数组中找出唯一重复的数-例题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;
            }
        }
    }
}

运行结果

完~

posted @ 2021-10-22 20:30  ╰(‵□′)╯  阅读(75)  评论(0编辑  收藏  举报