重复的两个总和问题 - 更惯用的 Javascript 解决方案

给定一个包含重复的整数数组,返回一个数组,其中所有索引对的总和为零。


[1, 2, 3, -1, 5, -5, 7, 9, -7, 2, -2] -> [ [ 3, 0 ], [ 5, 4 ], [ 8, 6 ], [ 10, 1 ], [ 10, 9 ] ]

我的JS解决方案:


function pairs(values, i) {

  if (values) {

    values.push(i);

    return values;

  }

  return [i];

}


function twoSum(arr) {

  const results = [];

  const map = new Map();

  arr.forEach((ele, i) => {

    if (map.get(-ele)) {

      map.get(-ele).forEach((e) => results.push([i, e]));

    }

    map.set(ele, pairs(map.get(ele), i));

  });

  return results;

}

来自 Ruby,这是我的 Ruby 解决方案:


def two_sum(arr)

  hash = Hash.new { |h, k| h[k] = [] }

  arr.each.with_index.each_with_object([]) do |(ele, i), results|

    if hash.key?(-ele)

      hash[-ele].each { |e| results << [i, e] }

    end

    hash[ele] << i

  end

end

这个想法是每个 hashmap 键都有一个数组,对于数组中的每个元素,我们检查 hashmap 是否有 -element 键,如果有,则将当前索引和每个值的对推送到结果数组中。


我怎样才能使 JS 解决方案更惯用?我在 JS 默认库中找不到以下内容(与 Ruby 相比):

  1. 将一个可枚举对象缩减为另一个可枚举对象(each_with_object)。

  2. 初始化一个映射,使每个新键对应一个对象(Hash.new([])、Hash.new(0) 等)。

对选择的解决方案进行了一点重构,最终得到了这样的结果:

function twoSum(arr) {

  const hash = new Map();

  return arr.reduce((results, ele, i) => {

    if (hash.has(-ele)) hash.get(-ele).forEach((e) => results.push([i, e]));

    hash.get(ele) ? hash.get(ele).push(i) : hash.set(ele, [i]);

    return results;

  }, []);

}


有只小跳蛙
浏览 138回答 2
2回答

喵喵时光机

function two_sum(arr) {&nbsp; &nbsp; let hash = new Map();&nbsp; &nbsp; return arr.reduce((results, ele, i) => {&nbsp; &nbsp; &nbsp; &nbsp; if (hash.has(-ele)) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; results = results.concat(hash.get(-ele).map(e => [i, e]))&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; hash.set(ele, hash.get(ele) || []);&nbsp; &nbsp; &nbsp; &nbsp; hash.get(ele).push(i);&nbsp; &nbsp; &nbsp; &nbsp; return results;&nbsp; &nbsp; }, []);}

慕娘9325324

像这样的事情,也许:const sumZeroIndexPairs = arr => {&nbsp; const hashMap = arr.reduce(&nbsp; &nbsp; (result, value, index, list) => {&nbsp; &nbsp; &nbsp; list.forEach((n, i) => {&nbsp; &nbsp; &nbsp; &nbsp; const key = [ index, i ].sort().join('_')&nbsp; &nbsp; &nbsp; &nbsp; const sum = value + n&nbsp; &nbsp; &nbsp; &nbsp; result[key] = sum&nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; return result&nbsp; &nbsp; },&nbsp; &nbsp; {}&nbsp; );&nbsp;&nbsp;&nbsp; return Object.entries(hashMap)&nbsp; &nbsp; .filter( ([key, value]) => value === 0 )&nbsp; &nbsp; .map(([key]) => key.split('_'));}console.log(sumZeroIndexPairs([1, 2, 3, -1, 5, -5, 7, 9, -7, 2, -2]))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript