查找最近的数字

时间:2017-02-10 07:02:33

标签: javascript

我正在尝试使用Javascript解决问题,但无法找到我的代码出了什么问题:

问题:

  

给出一个单词列表和两个单词word1和word2,返回   列表中这两个单词之间的最短距离。

例如,

  

假设单词= [“练习”,“制作”,“完美”,“编码”,   “使”]。

     

鉴于word1 =“coding”,word2 =“practice”,返回3.

     

鉴于word1 =“make”,word2 =“coding”,返回1.

我的解决方案:

var shortestDistance = function(words, word1, word2) {

  var w1=-1, w2=-1, min;

  words.forEach(function(word, index){

    if(word == word1)
      w1 = index;
    if(word == word2)
      w2 = index;
     if (w1 != -1 && w2 != -1)
        min = Math.abs(w1-w2);
  });
  return min;
};

它适用于上面指定的输入,但它对以下内容失败:

  

shortestDistance([“a”,“a”,“b”,“b”],“a”,“b”); (输出2而不是1)

我缺少什么?

2 个答案:

答案 0 :(得分:3)

每当你找到一个匹配你需要计算距离的单词时,然后看看它是否比你之前找到的最小距离短。



var shortestDistance = function(words, word1, word2) {

  var w1 = words.indexOf(word1);
  var w2 = words.indexOf(word2);
  if (w1 == -1 || w2 == -1) {
    // one of the words isn't in the list
    return 0;
  }
  var min = Math.abs(w1 - w2);
  words.forEach(function(word, index) {
    var distance;
    if (index > w1 && word == word1) {
      w1 = index;
      distance = Math.abs(w1 - w2);
    } else if (index > w2 && word == word2) {
      w2 = index;
      distance = Math.abs(w1 - w2);
    }
    if (distance < min) {
      min = distance;
    }
  });
  return min;
};
console.log(shortestDistance(["a","a","b","b"], "a","b"));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

发生了什么事?

  • 迭代1([“ a ”,“a”,“b”,“b”]):w1设为0
  • 迭代2([“a”,“ a ”,“b”,“b”]):w1设为1
  • 迭代3([“a”,“a”,“ b ”,“b”]):w2设为2

在这里,我们找到了w1w2的正确值。但是,您的程序不知道这一点,并继续前进:

  • 迭代4([“a”,“a”,“b”,“ b ”]):w2设为3

这是您的代码出现问题的原因。

我们能做什么?

简单地说,如果w1w2之间的距离小于之前的距离,我们需要检查每次迭代。这是我们可以做到的一种方式:

function shortestDistance(words, word1, word2) {
    var w1, w2;
    for (i=0;i<words.length;i++) {
        if (words[i] == word1) {
            w1 = i;
        }
        else if (words[i] == word2) {
            w2 = i;
        }
        if (w1!=null&&w2!=null) {
            break;
        }
    }
    return Math.abs(w1-w2);
}

此代码与原始代码几乎相同(我从foreach更改,因为break不起作用),但它会退出{{1}的值}和w1已被找到,从而确保它们始终是w2w1w2最接近的两个实例。

此代码将返回words - https://jsfiddle.net/joy40459/4/

的正确答案