首页 > 解决方案 > 是否可以优化我的 js hashmap 挑战以合并两个 .forEach 循环?

问题描述

是否可以将我的代码中的两个 arr.forEach() 函数合并在一起?

这是我的代码:

function countTriplets(arr, r) {
    let count = 0;
    let freq = {};
    let arrSum = [];
    
    arr.forEach((num) => {
        freq[num] ? freq[num]++ : freq[num] = 1;
    })
    
    arr.forEach((number) => {
        let sum = freq[number/r] * freq[number * r];
        if(!isNaN(sum)) {
            arrSum.push(sum);
        }
    });
    console.log("freq", freq);
    console.log("arrSum", arrSum);
    count = arrSum.reduce((a, b) => a + b);
    return count;
        
}

如果您想知道我的代码是关于什么的。它是计算数组中三元组的数量,例如[1, 5, 5, 25, 125]. 这是针对 HackerRank 挑战的:https ://www.hackerrank.com/challenges/count-triplets-1/problem 。此链接中发布的主要挑战是:

给定一个数组,您需要找到索引(i, j, k)的三元组数,以使这些索引处的元素对于给定的公比ri < j < k呈几何级数 。

例如,arr = [1, 4, 16, 64]。如果r = 4,我们有[1, 4, 16][4, 16, 64]

我从观看此视频中获得了解决方案/灵感:https ://www.youtube.com/watch?v=tBFZMaWP0W8 。

标签: javascriptoptimization

解决方案


正如@Bergi 的回答中提到的,您不能将这两个 for 循环结合起来。

但我相信你可以消除这一步:

count = arrSum.reduce((a, b) => a + b);

这是问题中算法的一个版本,它消除了 finalarrSum.reduce并使用reduce.forEach

function countTriplets(arr, r) {
  const freq = arr.reduce((freq, num) => {
    freq[num] = freq[num] ? freq[num] + 1 : 1;
    return freq;
  }, {});
  console.log('freq', freq);

  const count = arr.reduce((sum, number) => {
    const triplets =
      freq[number / r] && freq[number * r]
        ? freq[number / r] * freq[number * r]
        : 0;
    return sum + triplets;
  }, 0);
  return count;
}

const arr = [1, 5, 5, 25, 125];

const count = countTriplets(arr, 5);
console.log(`count:`, count);

还有这种情况r == 1。这是一个更快的计算,因为每个数字的三元组计数只是组合公式

                freq!          freq * (freq-1) * (freq-2)
triplets = ---------------- = ----------------------------
            3! * (freq-3)!                6

哪里的n!意思factorial of n


推荐阅读