给定一个整数数组,请找到其中缺少的数字。 - xiewenfeng/test GitHub Wiki

如果数组中的数字不重复: 1)如果只缺少一个数字,则将所有数字求和,利用1+2+3+...+N=N*(N+1)/2,利用求和的值与应该的和值相减,少的那个数就是两数差值。 2)如果缺少两个数字,则可以再组成一个数组从1-100,这样不缺少的数字都出现过两次,而缺少的数字只出现过一次,用前题的思路,求数组中只出现一次的两数字。 3)如果缺少多个数字,假设缺失的数字都用0替代了,在原始数组上,把A[i]调整到数组A[A[i]]位置上 如以 4 8 7 6 2 0 0 1 0 第1个下标是4,把它放到数组A[4]上,即变成 2 8 7 6 4 0 0 1 0 第1个下标是2,把它放到数组A[2]上,即变成 7 8 2 6 4 0 0 1 0 第1个下标是7,把它放到数组A[7]上,即变成 1 8 2 6 4 0 0 7 0 第1个下标是1,把它放到数组A[1]上,即变成 8 1 2 6 4 0 0 7 0 第1个下标是8,把它放到数组A[8]上,即变成 0 1 2 6 4 0 0 7 8 现在第1\2\3下标都是它们本来位置不变,第4个下标是6,把它放到数组A[6]上,即变成 0 1 2 0 4 0 6 7 8 除去元素0,其他元素都在自己位置上了,现在遍历元素,把值为0的数组下标值打印出来,就是数组缺失的元素了。

代码实现如下:

private void findMissData(int[] data, int num) {
    if(data == null || num < 1)
        return;
    int temp = 0;
    for(int i = 0; i < num; i++) {
        while(data[i] != i) {
            temp = data[i];
            data[i] = data[temp];
            data[temp]=temp;
        }
    }
    for(int i = 0; i < num; i++) {
        if(data[i] == 0) {
            System.out.println(i);
        }
    }
}