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

如何不创建数组,直接生成向数组中间插入索引后的序列?

解决方法:生成目标序列1 3 5 4 2 0(n=6)

简洁方案:利用序列规律直接生成

观察目标序列可明确规律:前半部分是1到n-1的奇数升序,后半部分是n-2到0的偶数降序(n=6时,奇数为1、3、5,偶数为4、2、0)。直接按此规律生成代码最简洁,也不会出错:

const n = 6;
// 生成奇数升序:1, 3, ..., n-1
const odds = Array.from({ length: n / 2 }, (_, idx) => 2 * idx + 1);
// 生成偶数降序:n-2, n-4, ..., 0
const evens = Array.from({ length: n / 2 }, (_, idx) => n - 2 - 2 * idx);
// 拼接得到结果
const result = [...odds, ...evens];
console.log(result); // 输出 [1, 3, 5, 4, 2, 0]

用reduce实现的插入逻辑修正

如果一定要用reduce模拟插入过程,核心是分奇偶收集后反转偶数数组(原插入逻辑本质是先添加奇数,再倒序添加偶数):

const n = 6;
const { odds, evens } = [...Array(n).keys()]
  .reduce((acc, curr) => {
    // 奇数加入奇数数组
    if (curr % 2 === 1) acc.odds.push(curr);
    // 偶数加入偶数数组(包含0)
    else acc.evens.push(curr);
    return acc;
  }, { odds: [], evens: [] });

// 反转偶数数组后拼接
const result = [...odds, ...evens.reverse()];
console.log(result); // 输出 [1, 3, 5, 4, 2, 0]

循环实现的修正版

如果用普通for循环,逻辑和reduce一致:

const n = 6;
const odds = [];
const evens = [];

for (let i = 0; i < n; i++) {
  if (i % 2 === 1) odds.push(i);
  else evens.push(i);
}

// 反转偶数数组后拼接
const result = [...odds, ...evens.reverse()];
console.log(result); // 输出 [1, 3, 5, 4, 2, 0]

你之前的代码出现重复5的问题,大概率是循环范围错误(比如遍历了n+1次)或者插入位置计算失误,导致重复插入了元素5。上面的方法都是基于序列的明确规律实现,不会出现这类错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:13:15