##题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
##解题思路
1,用额外的空间来给数组里的数字打标签,当发现重复标签的时候说明找到了
2,将数组里的数字放到和自己值相同的索引处,如果发现索引冲突,则说明找到了
##代码实现
/** * */ package 数组; /** * <p> * Title:Duplicate * </p> * <p> * Description: * </p> * * @author 田茂林 * @data 2017年8月26日 上午10:03:34 */ public class Duplicate { // ===========================================================================使用辅助的boolean数组 public static boolean duplicate(int numbers[], int length, int[] duplication) { if (numbers == null || length < 1) { return false; } for (int i = 0; i < duplication.length; i++) { // 数组元素是否超限判断 if (numbers[i] < 0 || numbers[i] > length - 1) { return false; } } boolean[] flag = new boolean[length]; for (int i = 0; i < length; i++) { flag[numbers[i]] = false; // 初始化所有数组元素都是false } for (int i = 0; i < length; i++) { if (flag[numbers[i]] == true) { // 遇到之前修改过的,就说明遇到重复的了 duplication[0] = numbers[i]; return true; } flag[numbers[i]] = true; // 遇到元素就修改为true } return false; } // ===========================================================================不使用额外空间 public static boolean duplicateSuper(int numbers[], int length, int[] duplication) { if (numbers == null || length < 1) { return false; } for (int i = 0; i < length; i++) { if (numbers[i] < 0 || numbers[i] > length - 1) { return false; } } for (int i = 0; i < length; i++) { while (numbers[i] != i) { if (numbers[i] == numbers[numbers[i]]) { //如果发现不同的索引处有相同的值,说明重复了 duplication[0] = numbers[i]; return true; } exchange(numbers, i, numbers[i]); //把数字放到和自己值相同的索引处 } } return false; } public static void exchange(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } public static void main(String[] args) { int[] array = { 2, 3, 1, 0, 2, 5, 3 }; int[] duplication = new int[1]; System.out.println(duplicate(array, 7, duplication)); } }