生成不重复的随机正整数放入到数组中,写出可执行的代码。
上述语句为一到java笔试题目,以取100内10个不重复的正整数数组为例,写了如下的代码:
int[] arr = new int[10];
boolean[] flag = new boolean[100];
for(int i=0;i<arr.length;i++){
arr[i] = (int)(Math.random()*100);
int num = arr[i];
System.out.println(num);
if(flag[num]){
i --;
}else{
flag[num] = true;
}
}
System.out.println(Arrays.toString(arr));
运行结果:
99
47
83
72
83
31
7
81
15
21
70
[99, 47, 83, 72, 31, 7, 81, 15, 21, 70]
很明显,最后的结果将重复的第二次出现的83去除掉了,实现了不重复的功能。
程序运行,生成一个长度为10的整数数组和一个长度100的boolean类型的数组。其中整数数组每一个元素初始值都为0,boolean类型数组每一个元素初始值都为false。在程序运行进入for循环后,随机为每一个元素取随机值,并且以该随机值为flag数组的下标,进行判断该元素的是否为true。若为true,则表示此次取到的随机值,已经取到了,重复出现,需要去除,需重新进行取随机值;若为false,则表示第一次取到该值,直接存入数组中。
只是在面试时,面试官不认为能实现该功能,让想一想一个简单的方法。后来思考后,写出如下代码:
int[] arr = new int[10];
Set
for(int i=0;i<arr.length;i++){
arr[i] = (int)(Math.random()*100);
System.out.println(arr[i]);
if(!set.add(arr[i])){
i --;
}
}
System.out.println(Arrays.toString(arr));
运行结果:
46
59
46
44
17
98
51
18
83
23
4
[46, 59, 44, 17, 98, 51, 18, 83, 23, 4]
简单方法中,Set集合为不可重复集,用add方法添加元素时,该元素的值第一次出现为true,重复出现则为false。根据set.add(arr[i])的值判定获取的随机数是否重复出现,若重复,则再次获取,若不重复,则直接存入数组中。