我正在尝试使用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)
我缺少什么?
答案 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;
答案 1 :(得分:1)
w1
设为0
w1
设为1
w2
设为2
在这里,我们找到了w1
和w2
的正确值。但是,您的程序不知道这一点,并继续前进:
w2
设为3
这是您的代码出现问题的原因。
简单地说,如果w1
和w2
之间的距离小于之前的距离,我们需要检查每次迭代。这是我们可以做到的一种方式:
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
已被找到,从而确保它们始终是w2
中w1
和w2
最接近的两个实例。
此代码将返回words
- https://jsfiddle.net/joy40459/4/