找出重复的那个数字。

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

解题思路:

将1到1000通过for循环进行整体异或得到一个值x。

然后将提供的1001个内容与x异或,这样就可以找到那个需要的答案。

原理就是   两个相同的数通过异或结果为0的特点。如:

[1,2,3,4,5]

[1,2,3,4,5,2]

会发现两两抵消,最后只会余下一个值。

import java.util.Random;

public class Main {
    final static int NUM = 10;

    static void swap(int arr[], int i, int j) {
        int c;
        c = arr[i];
        arr[i] = arr[j];
        arr[j] = c;
    }

    static int fun(int arr[]) {
        int x = 0;
        for (int i = 1; i <= NUM; i++) {
            x ^= i;
        }
        for (int i = 0; i < arr.length; i++) {
            x ^= arr[i];
        }

        return x;
    }

    public static void main(String[] args) {
        int[] arr = new int[NUM + 1];
        for (int i = 1; i < arr.length; i++) {
            arr[i] = i;
        }
        Random random = new Random();
        int n = random.nextInt(NUM) + 1;
        System.out.println(n);
        arr[0] = n;

        // 打乱次序
        for (int i = 0; i < arr.length; i++) {
            int t = random.nextInt(arr.length - i) + i;
            swap(arr, i, t);
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

        System.out.println("\n"+fun(arr));
    }
}

你可能感兴趣的:(java)