Javascript:在字符串中找到最长的单词

IT技术 javascript
2021-01-24 09:28:51
function longestWord(string) {
    var str = string.split(" ");
    var longest = 0;
    var word = null;
    for (var i = 0; i < str.length - 1; i++) {
        if (longest < str[i].length) {
            longest = str[i].length;
            word = str[i];
        }
    }
    return word;
}

当我打电话时longestWord("Pride and Prejudice"),它返回“傲慢”而不是“偏见”,这是最长的词......为什么?我检查了一些其他类似的问题,但解决方案看起来很像我的代码。

6个回答

那是因为您没有比较数组中的所有项目,而忽略了最后一个。

for (var i = 0; i < str.length - 1; i++)

应该

for (var i = 0; i < str.length; i++)

或者

for (var i = 0; i <= str.length - 1; i++)
我个人会向其他人推荐第一种可读性的解决方案。如果不是为了编译器优化(每次重新计算 str.length-1,但编译器现在不会做这样的蠢事),第二个需要更长的时间来编写并且效率会更低,所以现实世界的代码不会使用第二个解决方案, 在我的经验中。
2021-03-15 09:28:51
@coder543,它必须重新计算每次迭代,因为它.length可能是一个改变的访问器。不过,这是一个快速的操作。
2021-03-18 09:28:51
在数学上,两者是等价的。i < x 与 i <= x - 1 相同,因此编译器可以优化它,如果它有一个优化通道。
2021-03-22 09:28:51
谢谢!第二个解决方案是我想要做的,但我错过了等号。
2021-04-14 09:28:51

对此类问题采用函数式方法的一个优点是,您甚至不必计算

有关更多信息,请参阅MDN Array.reduce(注意:reduceIE8 需要垫片)

function longer(champ, contender) {
  return (contender.length > champ.length) ? contender : champ;
}

function longestWord(str) {
  var words = str.split(' ');
  return words.reduce(longer);
}

console.log(longestWord("The quick brown fox jumped over the lazy dogs"));

这是您使用 forEach 的解决方案,这将帮助您避免将来出现错误

function longestWord(string) {
    var str = string.split(" ");
    var longest = 0;
    var word = null;
    str.forEach(function(str) {
        if (longest < str.length) {
            longest = str.length;
            word = str;
        }
    });
    return word;
}
console.log(longestWord("pride and prejudice"));

你原来的问题只是str.length - 1本来应该是str.length,原来你不会得到数组的最后一个元素

你的情况有一个-1,它甚至从不扫描它:

for (var i = 0; i < str.length - 1; i++) {

应该:

for (var i = 0; i < str.length; i++) {

演示:http : //jsfiddle.net/LfgFk/

指数上升至str.length -1

for (var i = 0; i < str.length - 1; i++) {

所以最后一个字没有被处理

尝试:longestWord("Pride AAAAAAAAAAAAAAAAAAAAAAAAA and Prejudice")你会看到它起作用(返回AAAAAAAAAAAAAAAAAAAAAAAAA)。

如果您有疑问,修复它的最简单方法是-1for循环中删除

for (var i = 0; i < str.length; i++) {

检查两个版本(有问题的和已修复的)的演示:链接在这里