找出唯一成对的数(异或运算)
找出唯一成对的数
1-1000这一千个数放在含有1001个元素的数组中,只有唯一的一个元素值重复,其他均只出现一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间,能否设计一个算法实现?
思路一、
解题思路:由于每个元素只能访问一次,所以不能使用双重for循环暴力求解,不能使用辅助空间所以也不能使用木桶排序的思想,所以我们采用位运算中的异或运算求解
基础知识
A^0=AA^A=0
int x = 0;
for (int i = 1; i <= arr.length-1; i++) {
x = (x ^ i);
}
for (int i = 0; i < arr.length; i++) {
x = x ^ arr[i];
}
System.out.println(x);
第一个for循环将数组中的元素以^的形式排列起来
arr=[1,2,3,2,4]
//第一个for循环结束后x等价于0^1^2^3^2^4
第二个for循环相当于把x中相同的数字消去 且每个数字只消去一次 最终只留下多余的一个数
//0^1^2^3^2^4^1 == 0^2^3^2^4
//0^1^2^3^2^4^2 == 0^3^2^4
//0^1^2^3^2^4^3 == 0^2^4
//0^1^2^3^2^4^4 == 0^2 ==2
思路二、
使用一个额外的相同大小的数组计数,以原数组的数组元素作为额外数组的下标,没当原数组内元素出现,额外的数组下标对应的元素加1 最后查看额外数组中哪个元素为2 输出下标即为成对数
for (int i = 0; i < arr.length; i++) {
help[arr[i]]++;
}
for (int i = 0; i < arr.length; i++) {
if (help[i] == 2) {
System.out.println(i);
break;
}

浙公网安备 33010602011771号