首页 > 其他分享 >384. 打乱数组(中)

384. 打乱数组(中)

时间:2023-11-09 15:48:41浏览次数:31  
标签:shuffle temp nums self Solution 384 数组 打乱

目录

题目

  • 给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是 等可能 的。
    实现 Solution class:
    Solution(int[] nums) 使用整数数组 nums 初始化对象
    int[] reset() 重设数组到它的初始状态并返回
    int[] shuffle() 返回数组随机打乱后的结果

示例 1:

输入
["Solution", "shuffle", "reset", "shuffle"]
[[[1, 2, 3]], [], [], []]
输出
[null, [3, 1, 2], [1, 2, 3], [1, 3, 2]]
解释
Solution solution = new Solution([1, 2, 3]);
solution.shuffle(); // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如,返回 [3, 1, 2]
solution.reset(); // 重设数组到它的初始状态 [1, 2, 3] 。返回 [1, 2, 3]
solution.shuffle(); // 随机返回数组 [1, 2, 3] 打乱后的结果。例如,返回 [1, 3, 2]

法一、 Fisher-Yates

  • 原理:从最后一个元素开始,在之前的位置随机选一个与之交换,往前一位继续此操作直到第一位。
import random

class Solution:
    def __init__(self, nums):  #构造函数
        self.nums = nums  #将传入的数组赋值给类的成员变量self.nums

    def reset(self):
        return self.nums  #返回存储在self.nums中的原始数组

    def shuffle(self):
        temp = list(self.nums) #将原始数组self.nums的内容复制到临时数组temp中
        n = len(temp)
        for i in range(n - 1, 0, -1):  #从最后一个元素到第一个元素的循环
            # 随机选择一个位置
            j = random.randint(0, i)   #表示取0-i之间的一个整数
            # 交换当前位置元素和随机选择的位置元素
            temp[i], temp[j] = temp[j], temp[i]
        return temp

法二、鸽尾式洗牌法(Riffle Shuffle)

  • 原理:将数组一分为二,再穿插合并,再不断重复这样的操作

import random

class Solution:
    def __init__(self, nums):
        self.nums = nums

    def reset(self):
        return self.nums

    def shuffle(self):
        temp = list(self.nums)   #将原始数组self.nums的内容复制到临时数组temp中
        n = len(temp)
        mid = n // 2  # 找到数组的中间位置,使用整数除法来确保中间位置是一个整数

        # 迭代洗牌操作
        for i in range(mid):
            # 随机选择一个插入点
            j = random.randint(i, mid + i)
            
            # 将第二堆的牌插入到第一堆中
            temp[i], temp[j] = temp[j], temp[i]

        return temp  #返回洗牌后的数组temp

标签:shuffle,temp,nums,self,Solution,384,数组,打乱
From: https://www.cnblogs.com/lushuang55/p/17821823.html

相关文章

  • [DataX] DataX动态传参 - Column数组传参
     今天在CMD中执行命令,想着怎么动态传递列名,找了好久,没看到网上有写如何传列名的,自己试了下,找了很多双引号的转义,结果都不行,比如三个双引号"""(完全没效果),unicode的\u0022(转义成\"了,不是想要的").最后在Github找到了答案。column作为变量传到json中解析不正确·Issue#19......
  • c++数组最大长度(干货)
    ​    在编译器里,每种类型的变量定义数组的时候都有一个数组大小,而这个大小对于不同的变量而言有不同的上限,这里的最大长度更准确的来说应该是系统堆的最大值。字符类型数组一个字符占1byte大小,八位,所以,理论上,在一个64位的编译器中,一个字符数组的最大长度是2147483648,......
  • C语言程序设计 数组,结构体和指针练习题
    涉及知识点:数组,结构体和指针分析以下程序的运行结果:#include"stdio.h"structsp{inta;int*b;}*p;intd[3]={10,20,30};structspt[3]={70,&d[0],80,&d[1],90,&d[2]};voidmain(){p=t;printf(&......
  • js:遍历数组
    1.循环类型forEach()forEach();语法forEach(callbackFn)forEach(callbackFn,thisArg)例子/****@param{any}element数组中正在处理的当前元素*@param{number}index数组中正在处理的当前元素的索引。*@param{Array}array1调用了forEach()的数组本身*/co......
  • NTC 10K 3380 阻值对照表的数组
    因网上没有NTC10K3380的阻值温度对照数组,所以分享各种格式,以供使用直接根据阻值对照表的数组data=[202.2693,191.0637,180.5546,170.6944,161.4387,152.7468,144.5807,136.9052,129.6879,122.8985,116.5089,110.4932,104.8272,99.4883,94.4558,89.7101,85......
  • 【从零开始学习Go语言】八.Go语言的数组切片引用类型与值类型(总结)
    【从零开始学习Go语言】Go语言的数组与切片引用类型与值类型一.数组二.多维数组三.切片四.值类型与引用类型一.数组go语言的数组在之前的一些例子中有引用过,go的数组在创建时需要声明存储数据的类型,长度,并且长度在确定后便不可增加,类似python中的元组数组的声明方式有多种:第一种......
  • form表单 数组中对象校验 深度校验
    <el-formref="dataFormRef":model="form":rules="dataRules"formDialogReflabel-width="100px"v-loading="loading"> <el-form-itemlabel="负责人"prop="directorName"> <el-......
  • Java数组中常见的方法
    一、前言代码://给定一个数组int[]arr={234,312,32,1321,321,43};int[]arr1=newint[6];int[]arr2={1,3,7,8,32,432,432};二、复制1、arraycopy完成数组的复制//复制arr源数组,srcPos(0)源数组中起点的位置,arr1目标数组,des......
  • 关于Java使用Arrays类的equals()函数比较两个数组是否相等功能的实战
    关键词:文件流问题:二进制流文件丢失解决方法:java.util.Arrays.equals(byte1[],byte2[])分析:Arrays.equals()函数比较的是数组的内容而不是引用。也就是说,只有数组的元素内容相同,并且顺序也相同,才会返回true。      如果数组的元素内容相同但顺序不同,或者数组的引用......
  • 以下哪些选项可以将集合A转化为数组?
    AArray.from(A)B[].slice.apply(A)C[…A]D[].map.call(A,o=>o)正确答案:ABCDArray.from(arr,mapfn,thisArg)方法,用于将两类可以把对象转换为真正的数组:类似数组的对象和可遍历的对象(部署了Iterator接口的,String,ES6新增的Map和Set)。可以传3个参数,其中第一个是数组,必传......