*有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

你可能感兴趣的:(基本逻辑运算符的使用,java)