从数组中随机取若干个不重复的数

要求:从 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;
    }

}















猜你喜欢

转载自blog.csdn.net/never_compromise2580/article/details/82830811