要求:从 0 ~ 100 中随机取出十个不重复的 数
思路:
1: 利用数组,通过Math.random()*(arr.length -1) 然后将取到的数跟数组最后一个元素交换,将数组长度减一
下面代码中设计到 判断数组中是不是有重复元素 我的想法如下,如有错误还望大佬指正
1:如果数据量不大利用 HashSet的去重效果,将数组中的元素循环放入 Set之后判断set.size 和 数组长度是否相等
2:利用循环比较 第二个直接跟第三个开始比,依次类推
package I_Chap3;
import java.util.HashSet;
import java.util.Set;
public class Random_norepeat_arithmetic {
public static void main(String[] args) {
int[] arr = new int[100];
for (int i=0;i<100;i++){
arr[i] = i;
}
int[] rel = new int[10];
int len = arr.length;
double index;
int int_index;
for(int i=0;i<10;i++){
index = Math.random()*len;
// 将 double 类型的 数字转换成 int 并且不损失精度
int_index = (int)index;
rel[i] = arr[int_index];
swap(arr,int_index,len-1);
len--;
}
// for(int temp:rel){
// System.out.println(temp);
// }
boolean flag = judge2(arr);
if(flag == true){
System.out.println("true");
}else{
System.out.println("false");
}
}
public static void swap(int[] a,int start,int end){
int temp;
temp = a[start];
a[start] = a[end];
a[end] = temp;
}
/*
判断 数组中是不是存在重复的元素
1:利用 Hashset 因为 set 有去重的效果 把所有的元素放到 set 中 然后判断set 的长度是不是跟 数组长度相等
2:如果数组非常大,可以用时间来换取空间,上面这种办法则不可取
*/
public static Set<Integer> set = new HashSet<Integer>();
public static boolean judge(int[] arr){
set.clear();
if(arr.length == 0){
return true;
}else{
for(int a:arr){
set.add(a);
}
if(set.size() == arr.length){
return true;
}else{
return false;
}
}
}
/*
两两相比需要 n^2
比过了就不再比,减少比较的次数 比如第二个直接跟第三个开始比 第三个直接开始跟第四个开始比 一直比到倒数第二个就OK
*/
public static boolean judge2(int[] arr){
outer:
for(int i=0;i<arr.length -1;i++){
for(int j = i+1;j< arr.length ;j++){
if(arr[j] == arr[i]){
return false;
}
}
}
return true;
}
}