技术面试编码挑战:三数组去重及移除负数的实现疑问
解决思路:补上负数过滤的关键步骤
嘿,看来你已经搞定了去重这一步,差的就是负数过滤啦!核心遗漏的其实就是对元素添加“非负”的条件校验,我给你拆解下具体要补的步骤:
1. 明确需求的两个核心约束
你需要最终的结果同时满足:
- 无重复元素(你已实现)
- 无负数元素(遗漏的部分)
所以不管你用哪种方式处理数组,都要把「元素≥0」这个条件加进去。
2. 针对不同去重方式补全代码
我举两种常见场景的补全示例:
场景1:用Set快速去重(常见写法)
如果你原来的代码是先合并数组、再用Set去重:
// 原去重代码(仅完成去重) const mergedArrays = [...arr1, ...arr2, ...arr3]; const uniqueNumbers = [...new Set(mergedArrays)];
那只需要在去重后(或去重前)加上filter过滤负数:
// 补全后:先过滤负数再去重(更高效,减少Set的元素量) const mergedArrays = [...arr1, ...arr2, ...arr3]; const filteredNonNegative = mergedArrays.filter(num => num >= 0); const finalResult = [...new Set(filteredNonNegative)]; // 或者去重后再过滤(逻辑更直观,但性能稍差) const mergedArrays = [...arr1, ...arr2, ...arr3]; const uniqueNumbers = [...new Set(mergedArrays)]; const finalResult = uniqueNumbers.filter(num => num >= 0);
场景2:用循环手动去重
如果你是通过遍历+判断是否已存在来实现去重:
// 原去重代码(仅完成去重) const uniqueNumbers = []; for (const num of [...arr1, ...arr2, ...arr3]) { if (!uniqueNumbers.includes(num)) { uniqueNumbers.push(num); } }
那只需要在判断是否添加的条件里,加上「非负」的校验:
// 补全后:同时判断非负和是否重复 const finalResult = []; for (const num of [...arr1, ...arr2, ...arr3]) { // 先判断是否非负,再判断是否已存在 if (num >= 0 && !finalResult.includes(num)) { finalResult.push(num); } }
3. 额外提示:处理顺序影响性能
如果你的数组规模很大,先过滤负数再去重会更高效——因为提前排除了不需要的负数,减少了后续去重操作的元素数量。
内容的提问来源于stack exchange,提问作者jmccommas
相关产品推荐
相关产品推荐

