javascript - 使用单个循环仅添加数组的不同元素
问题描述
例如:给定一个数组:
var a = [5,4,3,2,1,4,5,6,7,1];
预期总和为:3+2+6+7 = 18
整个代码中应该只有一个 for 循环。
我失败的方法:
var a = [1,1,1,2,2,2,3,4,5,6,7,7,8,2]
var expected = 3+4+5+6+8
const sum1 = (a) => {
var s = 0;
var ch = {};
for(let i = 0; i<a.length; i++) {
if(s <0) {
s = 0;
}
if(ch[a[i]]) {
s -= a[i]
} else {
ch[a[i]] = a[i];
s += a[i];
}
}
return s
}
console.log(sum1(a))
解决方案
在每次迭代中,将被迭代的数字加到总和中。使用 Set 来跟踪迄今为止出现的数字。如果这个数字以前见过一次,从总和中减去它(这样就好像这个数字一开始就没有加到总和中)。如果它被看到两次或更多,请忽略它,因为它已经从总和中减去:
const sumUniques = (input) => {
let sum = 0;
// duplicates get put into seenOnce
// and subtracted from the sum
const seenOnce = new Set();
// duplicates in seenTwice get completely ignored;
// they've already been subtracted from the sum
const seenTwice = new Set();
input.forEach((num) => {
if (seenTwice.has(num)) {
return;
}
if (seenOnce.has(num)) {
sum -= num;
seenTwice.add(num);
} else {
sum += num;
seenOnce.add(num);
}
});
return sum;
}
console.log(sumUniques([5,4,3,2,1,4,5,6,7,1]))
console.log(sumUniques([1,1,1,2,2,2,3,4,5,6,7,7,8,2]))
推荐阅读
- mysql - Docker-compose 在网络模式下提供静态 IP:网桥
- angular - 在 Angular (9) ngFor 中处理空值
- flutter - Flutter Firebase 在 push 和 pop 操作后停止监听
- r - 错误:包“xml2”的编译失败
- php - 使用 php 从散列 url 获取实际链接的 url
- vue.js - 无法将 .obj 文件导入我的 Nuxt 组件
- javascript - 我可以在普通的网络浏览器页面中使用 puppeteer page.pdf 吗?
- mysql - 从 angular+node.js webapp 在数据库中添加新用户会添加/复制自身
- python - 如何在python中将非字符串类型的数据转换为字符串?
- html - SAFARI 渲染输入复选框的值。如何禁用复选框中的值?