剑指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 }

 

posted @ 2018-09-02 14:47  wei1  阅读(134)  评论(0编辑  收藏  举报