交换数组的所有元素,除了第一个和最后一个

amaatouq

我有一个看起来像这样的数组

const x = ['A','B','C','D','E']

我想拥有一个优雅的功能,可以改组数组的内容,但保持第一个或最后一个元素固定。诸如此类的操作customShuffle(x)将使数组混乱,但可以确保元素"A"位于第一个位置,而元素"E"位于最后一个位置。所有其他元素都被洗牌了。

丹吉格

如果数组的第一个和最后一个元素始终位于同一位置,则可以应用常规的改组算法,例如Fisher和Yates'的现代变体,跳过这些位置:

function customShuffle(arr) {
  if (arr.length < 3) {
    return arr;
  }
  
  // Note the -2 (instead of -1) and the i > 1 (instead of i > 0):
  
  for (let i = arr.length - 2; i > 1; --i) {
      const j = 1 + Math.floor(Math.random() * i);
      [arr[i], arr[j]] = [arr[j], arr[i]];
  }
  
  return arr;
}

console.log(customShuffle([1, 2, 3, 4, 5]).join(', '));
console.log(customShuffle(['A', 'B', 'C', 'D', 'E']).join(', '));
.as-console-wrapper {
  max-height: 100vh;
}

否则,如果您要选择第一个和最后一个元素(如您在原始问题中所指出的那样),则可以执行以下操作:

  1. 找到您想在第一的第一和最后一个位置元素的索引:firstIndexlastIndex
  2. 如果这些元素存在(它们可能不存在),则将它们从数组中删除。
  3. 将改组算法应用于其余元素(无需同时改组firstlast)。
  4. 如果需要,将第一个和最后一个元素添加回它们的位置。

function customShuffle(arr, first, last) {
  // Find and remove first and last:
  
  const firstIndex = arr.indexOf(first);  
  if (firstIndex !== -1) arr.splice(firstIndex, 1);  
  
  const lastIndex = arr.indexOf(last);
  if (lastIndex !== -1) arr.splice(lastIndex, 1);
  
  // Normal shuffle with the remainign elements using ES6:
  
  for (let i = arr.length - 1; i > 0; --i) {
      const j = Math.floor(Math.random() * (i + 1));
      [arr[i], arr[j]] = [arr[j], arr[i]];
  }
  
  // Add them back in their new position:
  
  if (firstIndex !== -1) arr.unshift(first);
  if (lastIndex !== -1) arr.push(last);
  
  return arr;
}

console.log(customShuffle([1, 2, 3, 4, 5], 5, 1).join(', '));
console.log(customShuffle(['A', 'B', 'C', 'D', 'E'], 'E', 'C').join(', '));
console.log(customShuffle([1, 2, 3, 4, 5], 10, 20).join(', '));
.as-console-wrapper {
  max-height: 100vh;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

丢弃 datetimeindex 的所有元素,除了第一个和最后一个

获取除第一个和最后一个以外的所有数组元素

需要一个数组,其中新数组的第一个元素=除第一个元素以外的所有元素的和

保留数组的第一个索引元素和最后一个索引元素

查找大于阈值的NumPy数组的第一个和最后一个元素

删除数组中的第一个和最后一个元素

减少数组到第一个和最后一个元素的元组?

NumPy数组中的第一个和最后一个元素

排除数组的第一个和最后一个元素

有5个“li”元素,如何交换第一个“li”元素和最后一个“li”元素?

数组元素为空,除了第一个

如何在C ++中交换队列的第一个和最后一个元素?

C-交换单链列表中的第一个和最后一个元素

CSS选择器在所有框(第一个和最后一个)中添加一个before伪元素?

从表中删除所有子元素,除了第一个?

PHP:从对象数组中删除所有重复项,除了第一个

除了最后一个元素外,所有数组元素都未定义?

减少ndarray的第一个维度-保留第一个和最后一个元素

选择数组中N个均匀间隔的元素,包括第一个和最后一个

数组中除第一个和最后一个元素外的其他元素

如何检查数组c ++中的第一个元素和最后一个元素

从最后一个元素到第一个元素添加到数组

除了使用 JQuery 的第一个和最后一个索引之外,如何编写一个随机化数组的函数

C ++:我有两个数组,其中第一个元素和最后一个元素具有相同的内存地址

交替打印最后一个元素和第一个元素(JavaScript)

如何识别对象数组中链的第一个和最后一个元素

以ES6方式获取数组中的第一个和最后一个元素

查找排序数组中元素的第一个和最后一个位置

将步骤数限制为第一个和最后一个数组元素