1. 程式人生 > >從陣列中隨機取若干個不重複的數

從陣列中隨機取若干個不重複的數

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

}