为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

有只小跳蛙 2021-11-18 16:17:19
给定一个包含重复的整数数组,返回一个数组,其中所有索引对的总和为零。[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  endend这个想法是每个 hashmap 键都有一个数组,对于数组中的每个元素,我们检查 hashmap 是否有 -element 键,如果有,则将当前索引和每个值的对推送到结果数组中。我怎样才能使 JS 解决方案更惯用?我在 JS 默认库中找不到以下内容(与 Ruby 相比):将一个可枚举对象缩减为另一个可枚举对象(each_with_object)。初始化一个映射,使每个新键对应一个对象(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;  }, []);}
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

function two_sum(arr) {

    let hash = new Map();


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

        if (hash.has(-ele)) {

            results = results.concat(hash.get(-ele).map(e => [i, e]))

        }


        hash.set(ele, hash.get(ele) || []);

        hash.get(ele).push(i);


        return results;


    }, []);

}


查看完整回答
反对 回复 2021-11-18
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

像这样的事情,也许:


const sumZeroIndexPairs = arr => {

  const hashMap = arr.reduce(

    (result, value, index, list) => {

      list.forEach((n, i) => {

        const key = [ index, i ].sort().join('_')

        const sum = value + n

        result[key] = sum

      })

      return result

    },

    {}

  );

  

  return Object.entries(hashMap)

    .filter( ([key, value]) => value === 0 )

    .map(([key]) => key.split('_'));

}


console.log(sumZeroIndexPairs([1, 2, 3, -1, 5, -5, 7, 9, -7, 2, -2]))


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信