当前位置: 首页 > 知识库问答 >
问题:

洗牌一个数组编码挑战。理解一部分有困难

傅彬
2023-03-14

问题:对一组没有重复的数字进行乱序。

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();

答:

 var Solution = function(nums) {

// hold nums in Solution

   this.nums = nums;
};

Solution.prototype.reset = function() {
   return this.nums;
};

Solution.prototype.shuffle = function() {

// create a copy of this.nums, shuffle it, and return it0

const shuffled = this.nums.slice();
const n = shuffled.length;
const swap = (arr, i, j) => {
    let tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

// swap elements with random elements
for (let i = 0; i < n; i++) 
    swap(shuffled, i, Math.floor(Math.random() * n));

return shuffled;
};

我的问题:Math.floor(Math.random()*n)你从数组的长度中得到一个随机索引。我不明白,这个代码不能重复吗?假设长度是3。公式不能得到2的索引和另一个2的索引,从而产生重复索引。有人能澄清一些我误解的事情吗?谢谢。Math.random自动撤回已经使用的索引吗?

共有2个答案

郁灿
2023-03-14

Math.floor(Math.random()*n)是的,它可以对相同的索引进行求值,但是这里您使用的是数字来交换元素,所以这是可以的。

Math.random会自动撤回已经使用过的索引吗?

不,你不需要跟踪以前生成的值

你能做的是用一个变量< code>object或< code>Map来跟踪先前添加的索引,如果随机生成的索引还没有被包括在那个变量中,则将其添加到最终输出中,否则再次生成一个新的索引,

但是在这种情况下并不需要。

蔚承天
2023-03-14

是的,< code > math . floor(math . random()* n)表达式可以多次计算同一个数字,但这没关系,因为随机数在< code>swap中使用,它将索引< code>i处的数字与所选随机索引处的数字进行交换。

如果随机索引取自原始数组并添加到要返回的数组中,例如

const randIndex = Math.floor(Math.random() * n);
arrToBeReturned.push(arr[randIndex]);

你可能是对的,但这不是算法所做的。想象一下随机排序< code>[1,2,3]的数组:

循环的第一次迭代:i为0,选择的随机索引为2。交换指示0和2:

[3, 2, 1]

第二次迭代:i为1,所选随机索引为2。交换索引1和2:

[3, 1, 2]

第三次迭代:< code>i是2,选择的随机索引是2。互换指数2和2:

[3, 1, 2]

使用此代码,每个索引至少与另一个索引随机交换一次,确保到最后,数组是随机的,没有偏见(假设Math.random是值得信赖的)。

 类似资料:
  • CodingBat中的给定任务sameEnds: 给定一个字符串,返回出现在字符串开头和结尾且不重叠的最长子字符串。例如,sameEnds(“abXab”)是“ab”。 我的解决方案通过了所有测试,除了一个^: 这里有什么问题?我怎样才能修复它?

  • 给定CodingBat中的任务maxBlock: 给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。 我的解决方案通过了所有测试,除了一个:

  • 这个问题要求在键盘上键入字符串所需的总时间,用一个手指表示为二维字符矩阵。 输入: 第一行包含n和m作为输入,表示键盘矩阵的维数 接下来的n行包含m个字符,每个字符表示键盘中的字符 下一行将包含字符串S 输出: 说明:手指最初位于键盘的第一个符号,因此按下该键所需的时间为0。之后,新键位于1,1,因此总时间为|1-0||1-0|即2。现在第三个键位于位置1,2,因此移动到该键的总时间为|2-1||

  • 问题内容: 我有以下提供商列表(俄语): 这些显然是在unicode中。以前,要执行SQL SELECT,我正在做: 现在,由于列表项使用的是unicode,因此我遇到了。 我将如何正确执行此sql语句? 问题答案: 您不应该用来在sql查询中包含值。改用sql参数: 原始清单在哪里。 想法是使用与列表中提供者数量匹配的SQL参数语法,通过测试生成SQL查询:对于两个提供者的列表。是的,MySQL

  • 我试图通过结合两种算法来返回最佳路径来解决旅行商问题 第一种算法使用环境ArrayList生成最佳路径 第二种算法将优化第一种算法获得的路由,但在这样做时,我需要创建一个新的ArrayList,即环境ArrayList,它被洗牌以匹配最佳路径数组的顺序 请你帮我做这个,因为我在洗牌环境数组列表时遇到了麻烦 这是环境ArrayList,其中每个节点由name、x cords、y cords组成: 返

  • 这个程序的目的是得到一个像“1256”这样的长变量,然后逐个数字相加,直到剩下一个个位整数。所以,,返回。 当我尝试验证时,它会给出错误: com.google.challenges.中找不到参数(int)的公共静态方法答案 有人能帮我理解这个错误的含义以及如何修复它吗?