剑指offer 面试题三 找出数组中重复的数字
1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class Duplicate1 { 7 /** 8 * 剑指offer 面试题三 找出数组中重复的数字 9 * 在一个长度为n的数组中的所有数字都在0~n-1的范围内。数组中某些数字是重复的, 10 * 但不知道有几个数字是重复的,也不知道每个数字重复了几次。请找到数组中任意 11 * 一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输 12 * 出重复数字为2或者3 13 * <p> 14 * 按照书上的第一种解法,时间复杂度为O(n) 空间复杂度为O(1),不过我写的是找到所有的 15 */ 16 17 public Integer[] findDuplicate(int[] numbers) { 18 HashSet<Integer> hashSet = new HashSet<>(); 19 20 if (numbers == null || numbers.length == 0) { 21 return null; 22 } 23 for (int i = 0; i < numbers.length; i++) { 24 if (numbers[i] < 0 || numbers[i] > numbers.length - 1) { 25 return null; 26 } 27 } 28 29 for (int i = 0; i < numbers.length; i++) { 30 if (numbers[i] != i) { 31 if (numbers[i] == numbers[numbers[i]]) { 32 hashSet.add(numbers[i]); 33 } else { 34 int tmp = numbers[i]; 35 numbers[i] = numbers[numbers[i]]; 36 numbers[tmp] = tmp; 37 38 // System.out.println(Arrays.toString(numbers)); 39 40 } 41 } 42 } 43 44 return hashSet.toArray(new Integer[hashSet.size()]); 45 } 46 47 @Test 48 public void testDuplicate1() { 49 int[] numbers = {2, 3, 1, 0, 2, 5, 3}; 50 System.out.println(Arrays.toString(numbers)); 51 System.out.println(Arrays.toString(findDuplicate(numbers))); 52 } 53 }