找出唯一成对的数(异或运算)

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

思路一、

解题思路:由于每个元素只能访问一次,所以不能使用双重for循环暴力求解,不能使用辅助空间所以也不能使用木桶排序的思想,所以我们采用位运算中的异或运算求解
基础知识
A^0=A
A^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;
  }

  

posted @ 2020-10-10 00:08  Mark_code  阅读(416)  评论(0)    收藏  举报