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 }