如何在JavaScript中实现数组元素依次淘汰直至仅剩一个元素?
实现指定环形淘汰逻辑
原始代码
let arr = [1, 2, 3, 4, 5]; for (let i = 0; i <= arr.length - 1; i++) { let ar = arr.splice(i, 1); console.log(ar.flat()) }
需求描述
现有数组[1,2,3,4,5],需实现如下环形淘汰逻辑:
- 第一轮:1淘汰2,3淘汰4,得到数组
[1,3,5] - 第二轮:5淘汰1,3淘汰5,最终剩余元素为3
实现方案
这是典型的环形淘汰问题,我们可以通过循环遍历+环形索引处理来实现:
function getLastRemainingElement(arr) { // 复制原数组,避免修改原始数据 let currentList = [...arr]; let shouldDelete = false; let currentIndex = 0; // 循环直到只剩一个元素 while (currentList.length > 1) { if (shouldDelete) { // 删除当前索引的元素 currentList.splice(currentIndex, 1); // 删除后下一个元素自动补位,无需递增索引 shouldDelete = false; } else { // 标记下一个元素需要被删除 shouldDelete = true; // 索引递增,通过取模实现环形遍历 currentIndex = (currentIndex + 1) % currentList.length; } } return currentList[0]; } // 测试验证 const originalArray = [1, 2, 3, 4, 5]; console.log(getLastRemainingElement(originalArray)); // 输出:3
代码逻辑说明
- 用
currentList复制原数组,防止修改原始数据 shouldDelete作为标记,控制当前元素是否需要被淘汰:- 初始为
false,表示第一轮先跳过第一个元素,淘汰第二个
- 初始为
- 循环处理直到数组只剩一个元素:
- 若标记为
true,删除当前索引元素,重置标记 - 若标记为
false,切换标记为true,索引递增并通过取模实现环形跳转(比如数组末尾后回到开头)
- 若标记为
- 最终返回剩余的唯一元素
内容的提问来源于stack exchange,提问作者rahim sayyad
相关产品推荐
相关产品推荐

