HackerRank上的对算法

时间:2016-12-11 09:06:42

标签: javascript algorithm

让我快速解释一下这个问题

最初来自这里: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

7 个答案:

答案 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不匹配的数组。然后你只需要返回最终数组的长度:

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:0)

您可以执行以下操作;

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

您可以使用for循环,Array.prototype.filter()Array.prototype.slice()将数组的每个元素与数组的其余部分进行比较。

&#13;
&#13;
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;
&#13;
&#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) 时间内返回元素的存在