2013-06-30 10 views
9
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; 
} 

Kiedy zadzwonić longestWord("Pride and Prejudice"), zwraca „” Duma i uprzedzenie „nie”, który jest najdłuższym słowem ... dlaczego? Sprawdziłem kilka innych podobnych pytań, ale rozwiązania wyglądały bardzo podobnie do mojego kodu.Javascript: znaleźć najdłuższy wyraz w ciąg

+4

Nie nazwij tablicy ciągów "str" ​​ – aaronman

Odpowiedz

13

To dlatego, że nie jesteś porównując wszystko elementy w tablicy, pomijając ostatnią.

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

należy

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

lub

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

Dzięki! Drugim rozwiązaniem jest to, co próbowałem zrobić, ale przegapiłem znak równości. – bard

+3

Osobiście poleciłbym pierwsze rozwiązanie dla czytelności innym. Druga zajmuje więcej czasu na pisanie i byłaby mniej wydajna, gdyby nie optymalizacje kompilatora (przeliczanie wartości str.length-1 za każdym razem, ale kompilatory nie robią tak głupich rzeczy jak teraz), więc kod realnego świata nie użyłby drugiego rozwiązania z mojego doświadczenia. – coder543

+0

@ coder543, to * musi * przeliczać każdą iterację, ponieważ '.length' może być akcesoriem, który się zmienia. Jest to jednak szybka operacja. – zzzzBov

3

indeks idzie w górę do str.length -1:

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

Więc ostatnie słowo nie jest przetwarzany.

Wypróbuj z: longestWord("Pride AAAAAAAAAAAAAAAAAAAAAAAAA and Prejudice"). Zobaczysz, że to działa (zwraca AAAAAAAAAAAAAAAAAAAAAAAAA).

Jeśli masz wątpliwości, najprostszym sposobem naprawy jest usunięcie -1 z pętli for.

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

Sprawdź demo z obu wersjach (problematycznej i stałych): link here.

0

Czy istnieje konkretny powód

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

nie jest

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

To wydaje się jak to mogło być przyczyną.

+9

Czy tracę zdanie, czy te dwa identyczne – aaronman

+0

@Aaronman LOL. Ponieważ odpowiedź została przyjęta, nie będę jej edytować. :) – Zong

4

Masz -1 w swoim stanie, to nigdy nawet skanuje go:

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

Powinno być:

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

Demo: http://jsfiddle.net/LfgFk/

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

do

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

OR

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

Trzeba użyć:

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

ten sposób będzie skanować całą frazę

4

Tutaj jest to rozwiązanie z foreach, to pomoże Ci uniknąć błędów w przyszłość

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")); 

Twoim pierwotnym problemem był tylko str.length - 1 sho uld właśnie zostały str.length, pierwotnie byś nie dostał się do ostatniego elementu tablicy

7

Jedną zaletą biorąc funkcjonalnego podejścia do tych problemów jest to, że nawet nie trzeba zachować Count:

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

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

Aby uzyskać więcej informacji, patrz MDN Array.reduce. (UWAGA: reduce potrzeby podkładka dla IE8)

0

Dzięki wszystkim, jest to kod stały:

function longestWord(string) { 
    var str = string.split(" "); 
    var longest = 0; 
    var word = null; 
    for (var i = 0; i < str.length; i++) { 
     var checkedLetters = ""; 
     for (var j = 0; j < str[i].length; j++) { 
      if (/[a-zA-Z]/.test(str[i][j])) { 
       checkedLetters += str[i][j]; 
      } 
     if (longest < checkedLetters.length) { 
      longest = checkedLetters.length; 
      word = checkedLetters; 
      } 
     } 
    } 
    return word; 
} 
0

To wydaje się być najprostszym sposobem, aby to zrobić.

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; 

}

1

Można uprościć kod z biblioteką jak Lo-Dash:

function longestWord(string) { 
    var words = string.split(' '); 
    return _.max(words, function(word) { return word.length; }); 
} 
1

ForEach jest szybszy w FF, ale wolniej w Chrome, ale dla pętli z pamięci podręcznej długości i funkcji Zastosuj/wywołanie jest znacznie szybsze zarówno w FF, jak i chrome.

Nadzieja poniższy kod pomaga:

function getLongest (arrStr) { 
    var longest = 0, word; 

    for(var i=0 , len = arrStr.length ; i < len ; i++){ 

    if(longest < arrStr[i].length) { 
     longest =arrStr[i].length; 
     word = arrStr[i]; 
    } 

    } 

    return word; 
} 

function isLongest (str) { 
    var arrayStr = str.split(' '); 
    return function(fn) { 
    return fn.apply(this,[arrayStr]); 
    } 
} 

isLongest("hello aaaaaaaaaaaaaaaaaaaaaaaaa bbb")(getLongest); //aaaaaaaaaaaaaaaaaaaaaaaaa 
0

powiedziałbym pomocą pętli foreach jest najbardziej zrozumiałą wersję

function longestWord(sen) { 
    big_word = "" 
    words = sen.split(" ") 
    words.forEach(function(word){ 
    if (word.length > big_word.length){ 
     big_word = word 
    }; 
    }); 
return big_word 
}; 
0

Myślę, że to bardziej proste

function findLongestWord(str) { 
    var longestStr = 0; 
    for (var x=0;x<str.split(' ').length;x++){ 
     if (longestStr < str.split(' ')[x].length){ 
      longestStr = str.split(' ')[x].length; 
     } 
    } 
    return longestStr; 
} 
0

Tutaj to jeszcze jeden sposób, aby go rozwiązać.

function findLongestWord(str) { 
 
    var result = []; 
 
    
 
    var one = str.split(" "); 
 
    
 
    for (var i = 0; i < one.length; i++) { 
 
    result[i] = one[i].length; 
 
    result.reverse().sort(function(a,b) { 
 
     return b-a; 
 
    }); 
 
    } 
 
    return result[0]; 
 
}

1

czy to rozwiąże problem ??

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; 
} 

document.write(longestWord("pride and prejudice")); 
0

Stosując metodę sort(), to sortuje elementy tablicy przez pewnego kryterium zamówień, a następnie zwraca długość pierwszego elementu tej tablicy i stąd najdłuższego słowa.

function longest(string){ 
    var longestWord = string.split(' ').sort(function(a,b){ 
     return b.length - a.length; 
    }); 
    return longestWord[0]; 
} 
1
function longestWord(sent){ 
var arr = sent.match(/[a-z]+/gi); 
arr.sort(function(a, b){ 
return b.length - a.length; 
}); 
return arr[0]; 
} 
longestWord('hello [email protected]#$%'); 
// ==> output: hello 
1

Uważam, że metoda .map tutaj pomaga dużo (to jeśli chcesz licznik znaków w słowie, a nie sam słowo):

function findLongestWord(str) { 
    var array = str.split(/\s+/); 
    var wordLength = array.map(function(i) { 
    return i.length;      
    }); 
    var largest = Math.max.apply(Math, wordLength); 
    return largest; 
} 
-1

Sprawdź, czy ten pomaga:

function longestWord(string){ 
    var str = string.split(" "); 
    var longest = 0; 
    var word = null; 
    for(var i=0; i < str.length; i++){ 
    if(longest < str[i].length){ 
     longest=str[i].length; 
     word=str[i]; 
    } 
    } 
    return word; 
} 
+1

To odpowiada na stare pytanie (2013), kiedy istnieje już zaakceptowana odpowiedź, która stwierdza to samo co ty. – Sebastian

0

Try This

function longest(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; 
    } 
+0

Ta sama odpowiedź już udzielona i zaakceptowana. – matthias

Powiązane problemy