一道取随机数的面试题
题目:写一个函数,它的作用是接受一个整数(假设为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 }
总结一下,算法的执行时间,取决于随机多少次可以找到那个没有重复的数。