如何对两个数组求和且不重复计算相同元素?
如何对两个数组去重后求和(不重复计算相同值)
嘿,我懂你碰到的困扰了——两个数组里说不定既有各自内部的重复元素,又有彼此重叠的值,直接把所有元素加起来肯定会把相同的数算好几遍,对吧?别慌,我给你分享几个实用的解决办法,拿最常用的Python和JavaScript举例,核心思路通用其他语言哦。
核心思路
不管用什么语言,核心步骤都是这三步:
- 把两个数组合并成一个集合(或者其他能自动去重的结构)
- 剔除掉所有重复出现的元素
- 对去重后的元素求和
Python 实现方法
方法1:用集合快速去重(最简便)
集合的特性就是不允许重复元素,刚好完美适配这个需求:
arr1 = [1, 2, 3, 4, 2] # 内部有重复的2 arr2 = [3, 4, 5, 6, 5] # 内部有重复的5,和arr1重叠3、4 # 合并数组并转成集合自动去重 unique_nums = set(arr1 + arr2) # 直接求和 total = sum(unique_nums) print(total) # 输出:1+2+3+4+5+6 = 21
这个方法效率很高,不管是数组内部的重复还是数组间的重叠,都能一次性处理掉。
方法2:保留元素首次出现的顺序(如果需要)
集合是无序的,要是你想保留元素第一次出现的顺序,可以用字典的fromkeys方法(Python 3.7+ 字典会保留插入顺序):
arr1 = [2, 1, 3, 3] arr2 = [3, 4, 2, 5] merged_arr = arr1 + arr2 # 用字典键去重,同时保留顺序 unique_ordered = list(dict.fromkeys(merged_arr)) total = sum(unique_ordered) print(total) # 输出:2+1+3+4+5 = 15
JavaScript 实现方法
方法1:Set + Reduce 求和
和Python的思路类似,用Set去重后,再用reduce累加求和:
const arr1 = [1, 2, 3, 4, 2]; const arr2 = [3, 4, 5, 6, 5]; // 合并两个数组,转成Set去重,再转回数组 const uniqueNums = [...new Set([...arr1, ...arr2])]; // 用reduce累加计算总和 const total = uniqueNums.reduce((acc, current) => acc + current, 0); console.log(total); // 输出21
方法2:手动遍历去重(适合理解底层逻辑)
要是你想手动实现去重逻辑,也可以用对象记录已经出现过的元素:
const arr1 = [1, 2, 3, 4, 2]; const arr2 = [3, 4, 5, 6, 5]; const seen = {}; let total = 0; // 遍历第一个数组 arr1.forEach(num => { if (!seen[num]) { seen[num] = true; total += num; } }); // 遍历第二个数组,只加没出现过的元素 arr2.forEach(num => { if (!seen[num]) { seen[num] = true; total += num; } }); console.log(total); // 输出21
这个方法适合新手理解去重求和的底层逻辑,不用依赖内置的Set结构。
不管你用哪种语言,只要抓住「去重再求和」的核心,都能轻松解决问题~
内容的提问来源于stack exchange,提问作者Tysaic
相关产品推荐
相关产品推荐

