一道取随机数的面试题

题目:写一个函数,它的作用是接受一个整数(假设为length),返回一个数组,数组的长度为length,数组中的内容为随机的0至(length-1)的值,并且不能重复。比如length为5的话,数组可能是[1,0,3,2,4]。

自己的写法:

 1 import java.util.Random;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         int[] result = getArray(500);
 7         sort(result);
 8         for (int i = 0; i < result.length; i++) {
 9             System.out.println(result[i]);
10         }
11     }
12 
13     private static int[] getArray(int length) {
14         int curor = 0;
15         int[] array = new int[length];
16         int temp = 0;
17         while(curor < length - 1) {
18             temp = new Random().nextInt(length);
19             if (!checkRepeated(array, temp)) {
20                 array[curor] = temp;
21                 curor++;
22             }
23         }
24         return array;
25     }
26 
27     private static boolean checkRepeated(int[] array, int temp) {
28         boolean hitFlg = false;
29         for (int i = 0; i < array.length; i++) {
30             if (array[i] == temp) {
31                 hitFlg = true;
32                 break;
33             }
34         }
35         return hitFlg;
36     }
37 
38     private static void sort(int[] a) {
39         for (int i = 0; i < a.length; i++) {
40             int temp = a[i];
41             int left = 0;
42             int right = i-1;
43             int mid = 0;
44             while(left<=right){
45                 mid = (left+right)/2;
46                 if(temp<a[mid]){
47                     right = mid-1;
48                 }else{
49                     left = mid+1;
50                 }
51             }
52             for (int j = i-1; j >= left; j--) {
53                 a[j+1] = a[j];
54             }
55             if(left != i){
56                 a[left] = temp;
57             }
58         }
59     }
60 }

另外一种更简洁更推荐的写法:

 1 import java.util.Random;
 2 
 3 public class Test {
 4 
 5     public static void main(String[] args) {
 6         int[] result = getRandIntArray(500);
 7         sort(result);
 8         for (int i = 0; i < result.length; i++) {
 9             System.out.println(result[i]);
10         }
11     }
12 
13     private static int[] getRandIntArray(int length) {
14         int[] randIntArray = new int[length];
15         Random rand = new Random();
16         boolean[] bool = new boolean[length];
17         int randInt = 0;
18         for (int i = 0; i < length; i++) {
19             do {
20                 randInt = rand.nextInt(length);
21                 randIntArray[i] = randInt;
22             } while (bool[randInt]);
23             bool[randInt] = true;
24         }
25         return randIntArray;
26     }
27 
28     private static void sort(int[] a) {
29         for (int i = 0; i < a.length; i++) {
30             int temp = a[i];
31             int left = 0;
32             int right = i-1;
33             int mid = 0;
34             while(left<=right){
35                 mid = (left+right)/2;
36                 if(temp<a[mid]){
37                     right = mid-1;
38                 }else{
39                     left = mid+1;
40                 }
41             }
42             for (int j = i-1; j >= left; j--) {
43                 a[j+1] = a[j];
44             }
45             if(left != i){
46                 a[left] = temp;
47             }
48         }
49     }
50 }

总结一下,算法的执行时间,取决于随机多少次可以找到那个没有重复的数。

 

posted @ 2016-10-20 15:53  苦味如昔  阅读(190)  评论(0编辑  收藏  举报