找出唯一成对的数

文章介绍了一个在含有1001个元素的数组中找出唯一重复元素的算法,数组中的其他元素各出现一次。算法基于异或操作,通过计算所有元素的异或值,最终得到重复的数字。这种方法无需额外的存储空间,并且每个数组元素只访问一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?

思路:使用异或,异或可以消除重复的数字。

比如A^A==0,A^0=A,A^A^B^C^C==B

原本数组有重复数,我们使用该数组异或一次不包含重复数该数组

比如:a[4]=1,2,3,3,那么我们就在来一个a[3]=1,2,3,两个进行异或。

public static void main(String []args){
        /*1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。
        每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?*/

        //定义那1001个元素,重复的那个使用随机数生成
        int N=1001;
        int []a = new int[N];
        for (int i=0; i < a.length-1; i++)
            a[i] = i+1;
        a[a.length-1] = new Random().nextInt(N-1)+1;//随机数是从0到我指定的N随机生成
        for (int b:a) {
            System.out.printf("%d ",b);
        }
        System.out.println();
        
        //利用异或
        int x=0;
        for (int i=1; i <= a.length-1; i++)
            x=x^i;
        for (int i=0; i < a.length; i++)
            x=x^a[i];

        System.out.print(x);
    }

当然如果题目没有要求不用辅助存储空间,我们还可以使用这种方法。

因为a数组是1-1000,所以我们可以用把a数组值当一个新数组的下标,然后每个下标自增1,当遇见a数组里面有重复的数时,新数组就会自增两次,从而等于2,以此为判断条件找到重复的数并且输出。

//借用辅助空间
        int []b = new int[N];
        for (int i=0; i < N; i++){
            b[a[i]]++;
        }
        for (int i=0; i < N; i++){
            if(b[i]==2) {
                System.out.print(i);
                break;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏遇云笺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值