找出数组中的重复数字 - xiewenfeng/test GitHub Wiki

在一个长度为n的数组里,所有数字都在0~n-1的范围内,数组中某些数字是重复的,不知道有几个是重复的,也不知道每个数字重复了几次,请找出数组中任意一个重复的数字。

思路一:

重排这个数组,从头到尾扫描这个数组中的每一个元素,当下标为i时,先比较这个数字m是不是等于i 若是:接着扫描下一个 若不是:拿这个数字和下标为m的数进行比较,如果它和第m个数相等,则找到重复值,如果不相等,就把它和第m个数交换,把m放到属于它的位置上去。

private void findReapetDigital(int[] array) {
        if (array == null) return;
        int length = array.length;
        for (int i = 0; i < length; i++) {
            while (array[i] != i) {
                if (array[i] < i) {
                    System.out.println(i);
                    break;
                } else {
                    int temp = array[i];
                    array[i] = i;
                    array[temp] = temp;
                }

            }
        }
    }  

思路二:

采用辅助数组,将辅助数组全部初始化为0,当遍历原数组,原数组的值作为辅助数组下标值加1,

private int[] deduplicate(int[] array) {
        if (array == null || array.length < 1) return null;
        int length = array.length;
        int[] tempArray = new int[length];
        for (int i = 0; i < length; i++) {
            tempArray[array[i]]++;
        }
        int k = 0;
        for (int j = 0; j < length; j++ ) {
            if (tempArray[j] > 0) {
                array[k++] = j;
            }
        }
        return array;
    }

扩展:

1、如果数组不知道范围,且可能不是数字或字母 方法一:遍历数组,将元素依次添加进结果集中,若结果集中已存在,则不再添加 方法二:先将原数组排序,与相邻的进行比较,如果不同则存入新数组; 方法三:利用hashSet集合无序不可重复的特性进行元素过滤; 方法四:TreeSet不仅可以使元素不重复,还可实现排序等功能。