如何不创建数组,直接生成向数组中间插入索引后的序列?
解决方法:生成目标序列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
相关产品推荐
相关产品推荐

