如何高效实现提取仅存在于单个数组中元素的函数?
优化方案:找出仅存在于单个数组的元素
需求说明
实现一个函数,返回仅存在于三个输入数组中某一个数组的元素,要求返回结果无重复,且适配不同长度的数组。
示例输入:
let arr1 = ['a', 'b', 'c', 'a', 'b'] let arr2 = ['a', 'd', 'b', 'c'] let arr3 = ['f', 'c', 'a']
预期输出:['d','f'] —— 其中'd'仅出现在arr2,'f'仅出现在arr3。
原暴力解法通过多层遍历结合includes检查实现,存在效率极低(includes为O(n)操作,多层嵌套后时间复杂度陡增)、可读性差的问题,以下是更优实现方案。
核心思路
统计每个元素被多少个不同的数组包含,最终筛选出仅被1个数组包含的元素。利用Set的O(1)查询特性和去重能力,大幅提升效率。
实现代码
function elementsInOnlyOneArr(a1, a2, a3) { // 将每个数组转为Set,实现内部去重+快速查询 const set1 = new Set(a1); const set2 = new Set(a2); const set3 = new Set(a3); // 收集所有出现过的唯一元素 const allElements = new Set([...set1, ...set2, ...set3]); const result = []; for (const el of allElements) { // 统计当前元素属于几个数组 let count = 0; if (set1.has(el)) count++; if (set2.has(el)) count++; if (set3.has(el)) count++; // 仅属于一个数组则加入结果 if (count === 1) { result.push(el); } } return result; }
方案优势
- 效率提升明显:Set的
has操作是O(1),整体时间复杂度为O(n1 + n2 + n3),远优于原暴力解法的嵌套O(n*m)复杂度 - 可读性更强:逻辑清晰,步骤明确,无需多层嵌套判断
- 自动去重:通过Set处理后,结果天然无重复元素
扩展支持多数组
如果需要支持任意数量的输入数组,可以修改为以下通用版本:
function elementsInOnlyOneArr(...arrs) { // 将所有输入数组转为Set集合 const sets = arrs.map(arr => new Set(arr)); // 收集所有出现过的唯一元素 const allElements = new Set(); sets.forEach(set => set.forEach(el => allElements.add(el))); const result = []; for (const el of allElements) { let count = 0; // 统计元素在多少个Set中存在 sets.forEach(set => set.has(el) && count++); // 仅属于一个数组则加入结果 if (count === 1) result.push(el); } return result; } // 调用示例 elementsInOnlyOneArr(arr1, arr2, arr3); // 返回 ['d','f']
内容的提问来源于stack exchange,提问作者kilex
相关产品推荐
相关产品推荐

