You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript实现Butterfly Shuffle?附指定输入输出示例

用JavaScript实现指定规则的Butterfly Shuffle(蝴蝶洗牌)

首先咱们先搞清楚你要的这个洗牌规则:输入序列[0,1,2,3,4,5,6,7,8,9]要输出[9,7,5,3,1,0,2,4,6,8],拆解一下这个变换逻辑:

  • 先把原序列里索引为奇数的元素(也就是1、3、5、7、9)倒过来排列,得到[9,7,5,3,1]
  • 再把原序列里索引为偶数的元素(也就是0、2、4、6、8)保持原顺序,得到[0,2,4,6,8]
  • 最后把这两部分拼在一起,就是目标输出

接下来给你两种实现方案,一种是简单直接的,另一种更通用:

方案一:针对指定输入的极简实现

这种写法利用数组的高阶函数,代码简洁易懂:

function butterflyShuffle(arr) {
  // 筛选出奇数索引的元素并倒序
  const reversedOdds = arr.filter((_, idx) => idx % 2 !== 0).reverse();
  // 筛选出偶数索引的元素保持原序
  const orderedEvens = arr.filter((_, idx) => idx % 2 === 0);
  // 拼接两部分返回
  return [...reversedOdds, ...orderedEvens];
}

// 测试一下
const input = [0,1,2,3,4,5,6,7,8,9];
const result = butterflyShuffle(input);
console.log(result); // 输出: [9,7,5,3,1,0,2,4,6,8]

方案二:通用版实现(支持任意偶数长度序列)

如果以后你要处理其他偶数长度的序列,这个版本更灵活,而且手动遍历的方式也更容易理解每一步的操作:

function genericButterflyShuffle(arr) {
  const length = arr.length;
  // 这里我们只处理偶数长度的序列,和你给出的输入一致
  if (length % 2 !== 0) {
    throw new Error("这个蝴蝶洗牌实现要求数组长度为偶数哦");
  }

  const oddElements = [];
  const evenElements = [];

  // 遍历数组,按索引奇偶拆分元素
  for (let i = 0; i < length; i++) {
    if (i % 2 === 1) {
      oddElements.push(arr[i]);
    } else {
      evenElements.push(arr[i]);
    }
  }

  // 奇数元素倒序后拼接偶数元素
  return [...oddElements.reverse(), ...evenElements];
}

// 测试
const input = [0,1,2,3,4,5,6,7,8,9];
console.log(genericButterflyShuffle(input)); // 同样得到目标输出

验证逻辑正确性

咱们手动核对一遍:

  • 原数组索引1对应1、3对应3、5对应5、7对应7、9对应9 → 倒序后就是9、7、5、3、1
  • 原数组索引0对应0、2对应2、4对应4、6对应6、8对应8 → 保持原序就是0、2、4、6、8
  • 把这两部分拼起来,完全符合你要的输出结果

要是你说的蝴蝶洗牌是其他定义(比如经典的分治蝶形交换那种),可以随时补充说明,但根据你给出的输入输出,上面的代码完全能满足需求。

内容的提问来源于stack exchange,提问作者Selvaprakasam Chellamuthu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:17:36