zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    CentOS7 安装 mysql
    redis简介以及redis集群配置
    分布式布局简述
    字符串
    接口
    接口回调
    java关键字之static
    java关键字之final
    java关键字之abstract
    memcache的配置
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9366615.html
Copyright © 2011-2022 走看看