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

如何在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

代码逻辑说明

  1. 用currentList复制原数组,防止修改原始数据
  2. shouldDelete作为标记,控制当前元素是否需要被淘汰:
    • 初始为false,表示第一轮先跳过第一个元素,淘汰第二个
  3. 循环处理直到数组只剩一个元素:
    • 若标记为true,删除当前索引元素,重置标记
    • 若标记为false,切换标记为true,索引递增并通过取模实现环形跳转(比如数组末尾后回到开头)
  4. 最终返回剩余的唯一元素

内容的提问来源于stack exchange,提问作者rahim sayyad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:45:23