Ответ 1
Это потому, что вы не сравниваете все элементы в массиве, вы не указываете последний.
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++)
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")
, он возвращает "Pride", а не "Prejudice", которое является самым длинным словом... почему? Я проверил некоторые другие подобные вопросы, но решения сильно походили на мой код.
Это потому, что вы не сравниваете все элементы в массиве, вы не указываете последний.
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++)
Одним из преимуществ функционального подхода к таким проблемам является то, что вам даже не нужно вести учет:
function longer(champ, contender) {
return (contender.length > champ.length) ? contender : champ;
}
function longestWord(str) {
var words = str.split(' ');
return words.reduce(longer);
}
См. MDN Array.reduce для получения дополнительной информации. (примечание: reduce
потребности шим для IE8)
У вас есть -1
в вашем состоянии, он даже не сканирует его:
for (var i = 0; i < str.length - 1; i++) {
Должно быть:
for (var i = 0; i < str.length; i++) {
Вот это ваше решение с 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
, изначально вы бы не попали в последний элемент массива
Индекс увеличивается до str.length -1
:
for (var i = 0; i < str.length - 1; i++) {
Таким образом, последнее слово не обрабатывается.
Попробуйте: longestWord("Pride AAAAAAAAAAAAAAAAAAAAAAAAA and Prejudice")
. Вы увидите, что он работает (возвращает AAAAAAAAAAAAAAAAAAAAAAAAA
).
Если у вас есть сомнения, самый простой способ исправить это - удалить -1
из цикла for
.
for (var i = 0; i < str.length; i++) {
Проверьте демоверсию обеих версий (проблемных и фиксированных): ссылка здесь.
for (var i = 0; i < str.length - 1; i++)
к
for (var i = 0; i <= str.length - 1; i++)
ИЛИ
for (var i = 0; i < str.length; i++)
Вы можете упростить свой код с помощью библиотеки, например Lo-Dash:
function longestWord(string) {
var words = string.split(' ');
return _.max(words, function(word) { return word.length; });
}
ForEach быстрее работает в FF, но медленнее в Chrome, но для цикла с кешированной длиной и функцией apply/call выполняется быстрее как в FF, так и в chrome.
Надеемся, что приведенный ниже код поможет:
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
это решает проблему?
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"));
function longestWord(sentence){
var arr = sentence.match(/[a-z]+/gi);
arr.sort(function(a, b){
return b.length - a.length;
});
return arr[0];
}
longestWord('hello [email protected]#$%');
// ==> output: hello
Я нахожу, что метод .map здесь очень помогает (это если вы хотите, чтобы число символов слова, а не само слово):
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;
}
Есть ли конкретная причина
for (var i = 0; i < str.length - 1; i++)
не
for (var i = 0; i < str.length - 1; i++)
Похоже, это может быть причиной.
Вам нужно использовать:
for (var i=0;i<=str.length - 1; i++)
Таким образом, он будет сканировать всю фразу
Спасибо всем, это фиксированный код:
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;
}
Это самый простой способ сделать это.
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;
}
Я бы сказал, что использование цикла forEach является наиболее понятной версией
function longestWord(sen) {
big_word = ""
words = sen.split(" ")
words.forEach(function(word){
if (word.length > big_word.length){
big_word = word
};
});
return big_word
};
Я думаю, что это проще
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;
}
Вот еще один способ его решения.
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];
}
Используя метод sort(), он сортирует элементы массива по некоторому критерию упорядочения и затем возвращает длину первого элемента этого массива и, следовательно, самое длинное слово.
function longest(string){
var longestWord = string.split(' ').sort(function(a,b){
return b.length - a.length;
});
return longestWord[0];
}
ПОПРОБУЙТЕ ЭТО
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;
}
Другой способ - использовать sort:
function longestWord(string) {
let longest = 0;
let str = str.split(" ").sort((word1,word2)=>{
});
return str[0].length;
}
longestWord('I love Python ')
Код ниже найдет самое большое слово и его длину из строки. Код имеет простой JavaScript и html.
function findLongestWord() {
var str = document.getElementById('inputText').value;
calculateLength(str);
}
function calculateLength(str) {
var substring = str.split(" ");
var minChar = '';
for (var i = 0; i <= substring.length - 1; i++) {
if (substring[i].length >= minChar.length) {
minChar = substring[i];
}
}
document.getElementById('longChar').innerHTML = 'Longest Word: ' + minChar;
document.getElementById('longCharLength').innerHTML = 'Longest Word length: ' + minChar.length;
}
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<input type="text" id="inputText"> <br/>
<button onclick=findLongestWord()>Click to find longest word</button> <br/>
<div id="longChar"></div> <br/>
<div id="longCharLength"></div>
</body>
<script src="longestWord.js"></script>
</html>
function findLongestWord(str) {
let stringArray = str.split(" ");
stringArray.sort(function(a, b){
return a.split('').length < b.split('').length;
})
return stringArray[0];
}
findLongestWord("The quick brown fox jumped over the lazy dog");
Я отсылаю вас к этой удивительной статье, которая определяет три способа:
1 - Найдите самое длинное слово с циклом FOR
function findLongestWord(str) {
var strSplit = str.split(' ');
var longestWord = 0;
for(var i = 0; i < strSplit.length; i++){
if(strSplit[i].length > longestWord){
longestWord = strSplit[i].length;
}
}
return longestWord;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
2 - Найдите самое длинное слово с помощью метода sort()
function findLongestWord(str) {
var longestWord = str.split(' ').sort(function(a, b) { return b.length - a.length; });
return longestWord[0].length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
3 - Найдите самое длинное слово с помощью метода redu()
function findLongestWord(str) {
var longestWord = str.split(' ').reduce(function(longest, currentWord) {
return currentWord.length > longest.length ? currentWord : longest;
}, "");
return longestWord.length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
Конечно, он возвращает длину самого большого слова, если вы хотите получить строку, просто избавьтесь от длины в возвращаемой части.
Один из вариантов реализации:
const findLongestWord = (str) => {
let word = ' ';
str.split(' ').forEach(item => word.length < item.length ? word = item : null);
return word;
}
findLongestWord("The quick brown fox jumped over the lazy dog") // return 'jumped'
findLongestWord("Google do a roll") // return 'Google'
findLongestWord("May the force be with you") // return 'force'
решения неполные. Что делать, если есть 2 или более слов, которые имеют одинаковую длину. вот лучшее решение:
longest = str => {
let words = str.split(" ");
let size = 0;
let max = [""];
for (let i = 0; i < words.length; i++) {
if (words[i].length > size) {
size = words[i].length;
}
if (max[max.length - 1].length < words[i].length) {
max = [];
max.push(words[i]);
} else {
max = [...max, words[i]];
}
}
return max;
};
Проверьте, помогает ли это:
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;
}
function longestWord(string) {
var str = string.split(" ");
var longest = 0;
var word = null;
for (var i=0; i < str.length-1; i++) {
word = longest < str[i].length ? str[i].length : longest;
word = str[i];
}
return word;
}
longestWord('I love Python ')