384. Shuffle an Array数组洗牌

[抄题]:

Shuffle a set of numbers without duplicates.

Example:

// Init an array with set 1, 2, and 3.
int[] nums = {1,2,3};
Solution solution = new Solution(nums);

// Shuffle the array [1,2,3] and return its result. Any permutation of [1,2,3] must equally likely to be returned.
solution.shuffle();

// Resets the array back to its original configuration [1,2,3].
solution.reset();

// Returns the random shuffling of array [1,2,3].
solution.shuffle();

 [暴力解法]:

时间分析:

空间分析:

 [优化后]:

时间分析:

空间分析:

[奇葩输出条件]:

[奇葩corner case]:

[思维问题]:

[英文数据结构或算法,为什么不用别的数据结构或算法]:

用克隆函数产生一个同样的数组

//use 'clone' to produce a same array
        this.copy = nums.clone();

产生随机数的几种方法:

通过System.currentTimeMillis()来获取随机数。实际上是获取当前时间毫秒数,它是long类型。使用方法如下:

final long l = System.currentTimeMillis();

通过Math.random()来获取随机数。实际上,它返回的是0(包含)到1(不包含)之间的double值。使用方法如下:

final double d = Math.random();

通过Random对象获取随机数。Random支持的随机值类型包括:boolean, byte, int, long, float, double。
比如,获取[0, 100)之间的int整数。方法如下:

int i2 = random.nextInt(100);

 

[一句话思路]:

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

不知道数组的大小就不用写出来,声明一下数组名即可

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

in-place也没有那么难,改改index,往里面塞就行了

math.random 和 random类是不同的

[复杂度]:Time complexity: O(n) Space complexity: O(1)

[算法思想:迭代/递归/分治/贪心]:

[关键模板化代码]:

[其他解法]:

[Follow Up]:

[LC给出的题目变变变]:

 [代码风格] :

 [是否头一次写此类driver funcion的代码] :

实现类的solution可能是自制的,要带上参数

数组必须一个个地打印:

 

class MyCode {
  public static void main (String[] args) {
    int[] nums = {1, 2, 3,54,32,55,87,13};
    Solution answer = new Solution(nums);
    int[] rst = answer.shuffle();
    for (int i = 0; i < 8; i++)
    System.out.println("rst[i] = " + rst[i]);
    
    int[] copy = answer.reset();
    for (int i = 0; i < 8; i++)
    System.out.println("copy[i] = " + copy[i]);
  }

 

 [潜台词] :

 

// package whatever; // don't place package name!

import java.io.*;
import java.util.*;
import java.lang.*;


class Solution {
    //unnecessary to declare the space of the array
    int[] nums;
    int[] copy;
    
    public Solution(int[] nums) {
        this.nums = nums;
        //use 'clone' to produce a same array
        this.copy = nums.clone();
    }
    
    /** Resets the array to its original configuration and return it. */
    public int[] reset() {
        return copy;
    }
    
    /** Returns a random shuffling of the array. */
    public int[] shuffle() {
        //random
        Random random = new Random();
        //generate a random index j, then swap
        for (int i = 0; i < nums.length; i++) {
            int j = random.nextInt(i + 1);
            int temp = nums[j];
            nums[j] = nums[i];
            nums[i] = temp;
        }
        //return
        return nums;
    }
}

class MyCode {
  public static void main (String[] args) {
    int[] nums = {1, 2, 3,54,32,55,87,13};
    Solution answer = new Solution(nums);
    int[] rst = answer.shuffle();
    for (int i = 0; i < 8; i++)
    System.out.println("rst[i] = " + rst[i]);
    
    int[] copy = answer.reset();
    for (int i = 0; i < 8; i++)
    System.out.println("copy[i] = " + copy[i]);
  }
}
View Code

 

posted @ 2018-07-25 16:22  苗妙苗  阅读(181)  评论(0编辑  收藏  举报