我还是一个web开发的大三学生,我正在努力解决这个问题。我必须找到这些数组中匹配对的数量:
var ar1 = [10, 20, 20, 10, 10, 30, 50, 10, 20] // return 3 (2 pairs of 10 and 1 pair of 20)
var ar2 = [1, 1, 3, 1, 2, 1, 3, 3, 3, 3] // return 4 (2 pairs of 1 and 2 pairs of 3)
// I started to write my logic below but I'm stuck, could you please help me to solve this problem ?
// The last result I am returning is a filtered array with all the nbs that are superior to 1 and then can't figure out how to get the result of matching pairs :-(
function countPairs(n, ar) {
const count = {};
ar.forEach((nb) => (count[nb] = (count[nb] || 0) + 1));
const values = Object.values(count);
const filter = values.filter((value) => value > 1);
return filter;
}
// 9 and 10 are the length of the arrays
console.log(countPairs(9, ar1))
console.log(countPairs(10, ar2))
非常感谢您的帮助!
8条答案
按热度按时间f87krz0w1#
也许有一种比这个 O(2n) 解更快/更好的方法来计算这个问题,但它是:
这首先计算每个数字的出现次数,并将其存储在Object中。完成后,我们对这些值进行化简,并返回与2相除的商(以获得总数)。
ippsafx72#
时间复杂度为O(n)维护一个对象,该对象跟踪一个数字之前是否被找到过,如果它之前被找到过,那么它组成一个对,所以我们增加对计数。如果不是,我们将该数字输入对象1
91zkwejq3#
我能找到的最简单的解决方案:
创建空字典
var t = {};
并使用它来计数数组arr.forEach (i => t[i] = (t[i] || 0) + 1);
中的每个项目。之后,取所有键Object.values(t)
,并将.reduce((acc, p) => acc + ..., 0)
相加,每个项的计数除以2p/2
,当然,Int语义为Math.floor(...)
。实现中的第一个参数不是必需的。如果答案有帮助,请投票
vd2z7a6w4#
使用Reduce方法的简洁方法
vsaztqbk5#
所以,我想要一个更简单的解决方案来解决这个问题,因为我刚刚开始学习编码,我正在自学。我发现这个解决方案非常适合你想要的。我没有创建这个解决方案,我在互联网上找到了它(https://www.geeksforgeeks.org/count-equal-element-pairs-in-the-given-array/),我只是将其翻译为JavaScript。
ny6fqffe6#
这里有一些更简洁的答案,但这里是我为您提供的解决方案:
ruoxqz4g7#
我希望我帮上忙了
jv2fixgn8#