javascript - 是否可以优化我的 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)的三元组数,以使这些索引处的元素对于给定的公比r和i < j < k呈几何级数 。
例如,arr = [1, 4, 16, 64]。如果r = 4,我们有[1, 4, 16] 和[4, 16, 64]。
我从观看此视频中获得了解决方案/灵感:https ://www.youtube.com/watch?v=tBFZMaWP0W8 。
解决方案
正如@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
。
推荐阅读
- ios - UIcollectionView 大小问题
- redis - 如何使 AWS Elasticache Redis 在所有只读副本中拆分读取请求?
- php - 如何从 url 隐藏 id 并使其干净 url 我的 .htaccess 文件目录是 /home/evidhya/public_html/tutorials/.htaccess
- c# - 有什么方法可以按照我需要的方式解决 Unity 中的 ODE 系统吗?
- c++ - goto 语句的使用
- python - Pandas 检查多个条件
- java - 在 google 上实施操作
- html - 循环遍历 Laravel Vue js 组件中的数据库表
- arrays - 从另一个矩阵的每个第 i 个元素中减去一个矩阵的每个第 n 个元素
- javascript - axios删除req.body后端未收到