leetcode-384-打亂陣列(shuffle an array)-java
阿新 • • 發佈:2018-11-11
題目及測試
package pid384; /* Shuffle an Array 打亂一個沒有重複元素的陣列。 示例: // 以數字集合 1, 2 和 3 初始化陣列。 int[] nums = {1,2,3}; Solution solution = new Solution(nums); // 打亂陣列 [1,2,3] 並返回結果。任何 [1,2,3]的排列返回的概率應該相同。 solution.shuffle(); // 重設陣列到它的初始狀態[1,2,3]。 solution.reset(); // 隨機返回陣列[1,2,3]打亂後的結果。 solution.shuffle(); */ public class main { public static void main(String[] args) { int[][] testTable = {{1,2,3},{2,7,9,3,1},{7,10,4,3,1},{11,6,2,7}}; for (int[] ito : testTable) { test(ito); } } private static void test(int[] ito) { Solution solution = new Solution(ito); int[] rtn; long begin = System.currentTimeMillis(); for (int i = 0; i < ito.length; i++) { System.out.print(ito[i]+" "); } System.out.println(); //開始時列印陣列 rtn = solution.shuffle();//執行程式 long end = System.currentTimeMillis(); System.out.println(ito + ": rtn=" ); System.out.println( " rtn=" ); for (int i = 0; i < rtn.length; i++) { System.out.print(rtn[i]+" "); }//列印結果幾陣列 rtn = solution.reset();//執行程式 System.out.println(ito + ": rtn=" ); System.out.println( " rtn=" ); for (int i = 0; i < rtn.length; i++) { System.out.print(rtn[i]+" "); }//列印結果幾陣列 System.out.println(); System.out.println("耗時:" + (end - begin) + "ms"); System.out.println("-------------------"); } }
解法1(成功,282ms,較慢)
在class中設定一個int陣列作為源頭
reset方法,返回一個copy的陣列
shuffle方法,將源頭陣列一個個加入linkedlist
int index=(int)(Math.random()*i);
每次將list的這個index的數字取出加入結果陣列
然後i–
package pid384; import java.lang.reflect.Array; import java.util.Arrays; import java.util.LinkedList; import java.util.List; class Solution { int[] source; public Solution(int[] nums) { source=nums; } /** Resets the array to its original configuration and return it. */ public int[] reset() { int[] result=Arrays.copyOf(source,source.length); return result; } /** Returns a random shuffling of the array. */ public int[] shuffle() { List<Integer> list=new LinkedList<>(); int length=source.length; if(length==0){ return null; } int[] result=new int[length]; for(int i=0;i<length;i++){ list.add(source[i]); } for(int i=length;i>0;i--){ int index=(int)(Math.random()*i); result[length-i]=list.get(index); list.remove(index); } return result; } } /** * Your Solution object will be instantiated and called as such: * Solution obj = new Solution(nums); * int[] param_1 = obj.reset(); * int[] param_2 = obj.shuffle(); */
解法2(別人的)
這個題要用兩個陣列,一個儲存原來的資料,一個儲存工作的資料。
首次:不要用=(等號是把兩個引用指向統一位置),要記得複製陣列。
方法是:複製後,以i逆序遍歷工作陣列,可以在[0 - i]中隨機選一個數,這個數是工作陣列中被選中數的索引,然後將被選中的數與第i個數交換位置。
import java.util.Random; class Solution { private int[] originalNums; private int[] currentNums; public Solution(int[] nums) { originalNums = nums; } /** Resets the array to its original configuration and return it. */ public int[] reset() { return originalNums; } /** Returns a random shuffling of the array. */ public int[] shuffle() { currentNums = Arrays.copyOf(originalNums, originalNums.length); Random randNum = new Random(); for (int i = currentNums.length - 1; i >= 0; i--) { int selectedElem = randNum.nextInt(i + 1); int temp = currentNums[selectedElem]; currentNums[selectedElem] = currentNums[i]; currentNums[i] = temp; } return currentNums; } } /** * Your Solution object will be instantiated and called as such: * Solution obj = new Solution(nums); * int[] param_1 = obj.reset(); * int[] param_2 = obj.shuffle(); */