当前位置 博文首页 > 文章内容

    leetcode之384打乱数组Golang

    作者: 栏目:未分类 时间:2020-10-15 15:06:00

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    题目描述

    打乱一个没有重复元素的数组。

    示例:

    // 以数字集合 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();
    

    算法

    这里只说随机返回数组打乱的方式

    其实就是求解随机数

    下面是go语言求随机数的方法

    // 设置随机数种子
    rand.Seed(time.Now().UnixNano())
    // 求0-9的随机数
    number:=rand.Intn(10)
    

    接下来就是将数组随机打乱方式

    • 遍历数组,设数组长度为length
      • 对于第一个数,使用随机数求0--(length-1)之间的随机数,这个随机数就是数组的一个下标,将这个下标对应的数组中的元素与第一个元素交换位置
      • 对于第二个数,使用随机数求0--(length-2)之间的随机数,然后将这个随机数加上1,得到数组剩下元素中的一个下标,将这个下标对应的元素与第二个元素交换位置
      • 一直重复上面的操作,知道遍历完整个数组,那么得到的新的数组就是随机打乱后的数组

    代码

    	// 使用洗牌算法
    	// 设置随机数种子
    	rand.Seed(time.Now().UnixNano())
    	// 新创建一个底层数组,因为我们后面会修改这个底层数组的值,所以为了能够重置,我们需要新创建一个底层数组
    	res := make([]int, len(s.originalArray))
    	copy(res, s.originalArray)
    	length := len(res)
    	for i := 0; i < length; i++ {
    		index := rand.Intn(length - i)
    		res[i], res[index+i] = res[index+i], res[i]
    	}
    	return res