如何用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
相关产品推荐
相关产品推荐

