1. 程式人生 > >leetcode-384-打亂陣列(shuffle an array)-java

leetcode-384-打亂陣列(shuffle an array)-java

題目及測試

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();
 */