力扣每日一题2021-11-22打乱数组


384.打乱数组

题目描述

打乱数组


思路

暴力解法

首先考虑如何随机打乱一个数组。不妨设数组nums的长度为n,可以使用如下方法打乱:

  • 将数组中的所有数放到数据结构中,并初始化打乱后的数组shuffled;
  • 循环n次,在第i次循环中(0 <= i < n):
    • 在数据结构中取出一个数num,将其作为打乱后的数组shuffled的第i个元素;
    • 从数据结构中移除num。

对于原数组中的数num来说,被移动到打乱后的数组的任一位置的概率都是相同的。
在具体实现过程中,可以定义originals数组用来存储数组的初始状态,用于重设数组到初始状态;用数组实现上述过程中的数据结构。

Python实现

Python实现

# 暴力
class Solution:

    def __init__(self, nums: List[int]):
        self.nums = nums
        self.originals = nums.copy()

    def reset(self) -> List[int]:
        self.nums = self.originals.copy()
        return self.nums

    def shuffle(self) -> List[int]:
        shuffled = [0] * len(self.nums)
        for i in range(len(self.nums)):
            j = random.randrange(len(self.nums))
            shuffled[i] = self.nums.pop(j)
        self.nums = shuffled
        return self.nums
Java实现

Java实现

// 暴力
class Solution {
    private int[] nums;
    private int[] originals;
    
    public Solution(int[] nums) {
        this.nums = nums;
        this.originals = new int[nums.length];
        System.arraycopy(nums, 0, originals, 0, nums.length);
    }
    
    public int[] reset() {
        System.arraycopy(originals, 0, nums, 0, nums.length);
        return nums;
    }
    
    public int[] shuffle() {
        int[] shuffled = new int[nums.length];
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < nums.length; ++i) {
            list.add(nums[i]);
        }
        Random random = new Random();
        for (int i = 0; i < nums.length; ++i) {
            int j = random.nextInt(list.size());
            shuffled[i] = list.remove(j);
        }
        System.arraycopy(shuffled, 0, nums, 0, nums.length);
        return nums;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值