让我快速解释一下这个问题
最初来自这里:https://www.hackerrank.com/challenges/pairs
示例输入为:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.HBox?>
<HBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Sec">
<children>
<TextField fx:id="textfield" />
<Button fx:id="button" mnemonicParsing="false" onAction="#setToCombo" text="Add to Combo" />
</children>
</HBox>
引用上述输入
第一行:
5 2
1 5 3 4 2
其中N是集合中的整数,K是我们正在寻找的差异
第二行(作为数组):
N = 5, K = 2
数组中有多少对具有K的差异?
示例答案: &#34;集合中有3对整数,差异为2.&#34;
这是我为此而努力的事情,但我遗漏了一些东西:
[1, 5, 3, 4, 2];
输出:
function findDifference(k, nArr) {
nArr.sort((a, b) => a - b);
var pairsWithDifferenceOfK = 0;
for (var i = 0; i < nArr.length; i++) {
if (Math.abs((nArr[i] - ((nArr.length > (i + k)) ? nArr[(i + k)] : nArr[i]))) === k) {
pairsWithDifferenceOfK++;
};
}
console.log(pairsWithDifferenceOfK);
}
var K = 2;
Arr = [1, 5, 3, 4, 2];
findDifference(K, Arr);
当给出这些输入时,这会失败(我很好奇为什么这对某些输入而不是其他输入失败):
3
答案 0 :(得分:2)
解决这个问题的一种方法可能是递归。在函数的每次迭代中,您可以获取第一个元素,然后将其与其余元素进行比较。例如,你从
开始var rest = arr.splice(1);
其中rest
为[5, 3, 4, 2]
,您将每个元素与1
进行比较,然后将休息传递给您将[3, 4, 2]
与5
等进行比较的函数。然后检查每个元素,如果差异是k
,那么你是否增加了结果。当arr
参数变为空时,数组函数将退出或返回1.
var K = 2;
var array = [1, 5, 3, 4, 2];
function findDifference(k, arr) {
var r = 0;
function inner(k, arr) {
if (!arr.length) return 1;
var rest = arr.splice(1);
rest.forEach(function(e) {
if (Math.abs(arr[0] - e) == k) r++;
})
inner(k, rest);
}
inner(k, arr);
return r;
}
console.log(findDifference(K, array));
答案 1 :(得分:0)
我建议你用一对组合填充数组,并删除那些与K不匹配的数组。然后你只需要返回最终数组的长度:
var findDifference = (array, K) => {
var pairs = [];
array.forEach((x, i, arr) => arr.slice(i+1).forEach(y => pairs.push([x, y])));
return pairs.filter(x => Math.abs(x[0]-x[1]) === 2).length;
}
console.log(findDifference([1, 5, 3, 4, 2], 2));
&#13;
答案 2 :(得分:0)
您可以执行以下操作;
function countTargetDiff(ar,td){
return ar.reduce((p,c,i,a) => p += a.slice(i+1).filter(f => Math.abs(c-f) === td).length,0);
}
arr = [1, 5, 3, 4, 2],
k = 2,
res = countTargetDiff(arr,k);
console.log(res);
&#13;
答案 3 :(得分:0)
您可以使用for
循环,Array.prototype.filter()
,Array.prototype.slice()
将数组的每个元素与数组的其余部分进行比较。
var array = [1, 5, 3, 4, 2];
var n = 0;
for (var i = 0, j = 2; i < array.length; i++) {
if (i + 1 < array.length) {
var curr = array[i];
var not = array.slice(i + 1).filter(function(el) {
return el !== curr;
});
var diff = not.filter(function(el) {
return el - curr === j || curr - el === j
});
if (diff.length) {
n += 1
}
}
}
console.log(n)
&#13;
答案 4 :(得分:0)
此挑战的问题在于测试用例10到14使用了大量数字,因此您必须找到一种有效的方法来避免超时问题。
另一种解决方法是根据它们的不同,每次比较排序数组中的两个数字。
基本上,如果numA和numB之间的差异小于K,你就知道你必须通过向numB移动到右边来找到更大的数字。如果你的差异大于K,你就知道你必须通过寻找更大的数量来缩小差距。
const n = 5, k = 2, numbers = [1, 5, 3, 4 ,2]
numbers.sort((a, b) => a - b); //increasing order
let index1 = 0, index2 = 1, pairs = 0;
while (index2 < n) {
let difference = numbers[index2] - numbers[index1];
if (difference === k) (pairs++, index2++);
if (difference < k) index2++;
if (difference > k) index1++;
}
console.log(pairs === 3);
这样你减少了很多操作,因此最复杂。你应该通过这个挑战传递所有16个测试案例。
答案 5 :(得分:0)
processing-X.Y.Z/modes/java/libraries/svg/library
答案 6 :(得分:0)
通过 Set
在 JavaScript 中实现的近线性解决方案如下:
function pairs(k, arr) {
const points = new Set(arr);
let pairs = 0;
for (let i = 0; i < arr.length; i++) {
if (points.has(arr[i] - k)) {
pairs++;
}
}
return pairs;
}
console.log(pairs(2, [1, 5, 3, 4, 2]));
假设 Set 将在 O(1)
时间内返回元素的存在