*有1~1000这1000个数,放在大小为1001的数组中,只有一个元素值重复,要求不用辅助空间,每个数访问一次,找出重复的元素*

Java中 ^异或 &相与小常识

学过基本逻辑运算符我们知道 ^ 异或是什么意思
无外乎:相同为零,相异为1。
即 0 ^ 1 = 1,0 ^ 0 =0,1 ^ 1 = 0;
延伸至变量 :a ^ a = 0; a ^ 0 = a;
我们经常在某些交换值的算法中用到

void swap(int &a, int &b){
	a = a^b;用a来当作中间桥梁
	b = a^b;(即是(a ^ b) ^ b = a ^ 0 = a);//这样即是交换了a和b的值
	a = a^b;//同理这个时候变成了 (a ^ b) ^ a = b;
}

所以来看这道入门题,参照网上一些大神的解法:

有1~1000这1000个数,放在大小为1001的数组中,只有一个元素值重复,要求不用辅助空间,每个数访问一次,找出重复的元素

不难得到:

public class Yihuo {
public static void main(String[] args) {
	int x = 0;
	int[] arr = new int[1001];
	//解释说明一下,因为是开了一个1001的数组,但是又因为有一个数重复
	所以是arr.length -1
	for (int i = 0; i < arr.length-1; i++) {
		arr[i] = i + 1;
//		System.out.println(arr[i]);这里可以自己测试一下
	}
	arr[arr.length -1] = new Random().nextInt(1000)+1;
	//让这个重复的数随机生成
//这里就是让 x ^ i(相当于0^1^2……),
感到疑惑的小伙伴可以打印出来看看 ,你会发现最后相当于x = 0;很神奇
	for (int i = 1; i < arr.length-1; i++) {
		x = x ^ i;  
		System.out.println(x);
	}
	//最后再用这个x ^arr[i],这里就可以找出重复的值
(0 ^ 重复的数时,必然会让这个数显性)
	for (int i = 0; i < arr.length; i++) {
		x = x^arr[i];
	}
	System.out.println(x);
}

这里做一个小小记录,如果有不懂的小伙伴,再建议多找找其他技术帖看看。。
这里奉上另一位大神的思路:
https://blog.csdn.net/qq_45784913/article/details/104172655

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wo_yuanchengfeng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值