算法很美(蓝桥) | 1.2 唯一成对的数

1.2 如何找到数组中唯一成对的那个数

题目

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

标签

  • 位运算
  • 异或

思路

异或运算可以消除重复的数,例如

A ^ A ^ B ^ C ^ C = B

构造1-1000个数的数组(不重复),将其与题目给的1001个数挨个异或,最后剩下的就是要求的那个数

代码

public static void main(String[] args) {
    // ===================构造题目所需数组Start===================
    int N = 1001;
    int[] arr = new int[N];
    for (int i = 0; i < arr.length - 1; i++) {
        arr[i] = i + 1;
    }
    //最后一个数,是随机数
    arr[arr.length - 1] = new Random().nextInt(N - 1) + 1;
    //随机下标
    int index = new Random().nextInt(N);
    Util.swap(arr, index, arr.length - 1);
    Util.print(arr);
    // ===================构造题目所需数组End===================
    int x1 = 0;
    // 构造1-1000的数组
    for (int i = 1; i <= N - 1; i++) {
        x1 = (x1 ^ i);
    }
    // 遍历每个数,与题目给定的数组进行异或运算,求得结果
    for (int i = 0; i < N; i++) {
        x1 = x1 ^ arr[i];
    }
    System.out.println(x1);
}

总结

题目的重点就是不适用额外空间,如果可以使用,其实也可以准备一个1000长度的数组A,存储给定的数组每个数出现的次数,然后再遍历数组A即可获得结果。

异或解法不仅空间复杂度较低,而且效率更高

posted @ 2021-04-18 23:45  进击的阿晨  阅读(54)  评论(0编辑  收藏  举报