首页 > 解决方案 > 使用单个循环仅添加数组的不同元素

问题描述

例如:给定一个数组:

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))

标签: javascriptarraysalgorithmdata-structureshashmap

解决方案


在每次迭代中,将被迭代的数字加到总和中。使用 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]))


推荐阅读