Подтвердить что ты не робот

Возвращение длины наибольшего слова в предложении

Я написал функцию, которая получает предложение и вычисляет самое длинное слово в этом предложении.

function findLongestWord(str) {

  var charArray = str.split(" ");
  var wordArray = [];


  for(var i = 0; i < charArray.length; i++ ) {
    wordArray.push(charArray[i].length);
    wordArray.sort();
    wordArray.reverse();

  }

  return wordArray[0];
}

Моя функция работает со входами, такими как:

findLongestWord("The quick brown fox jumped over the lazy dog");

Но когда я его передаю:

findLongestWord("What if we try a super-long word such as otorhinolaryngology")

Функция возвращает:

4

Вместо

19
4b9b3361

Ответ 1

Согласно документы:

Метод sort() сортирует элементы массива на месте и возвращает массив. Сорт не обязательно стабильный. Сортировка по умолчанию порядок соответствует строковым кодам Unicode.

[...]

Синтаксис

arr.sort()

arr.sort(compareFunction)

Параметры

compareFunction Необязательный

Определяет функцию, которая определяет порядок сортировки. Если опустить, массив сортируется в соответствии с каждой символьной точкой кода Unicode значение в соответствии с преобразованием строки каждого элемента.

Подчеркните мой, так что вы получите что-то вроде этого:

var str = "What if we try a super-long word such as otorhinolaryngology";
var charArray = str.split(" ");
// now charArray == ["What", "if", "we", "try", "a", "super-long", "word", "such", "as", "otorhinolaryngology"]
// when you take the length of each word and end up with
var wordArray = [4, 2, 2, 3, 1, 10, 4, 4, 2, 19];
// and if you use plain wordArray.sort() without specific sort function you get
wordArray = [1, 10, 19, 2, 2, 2, 3, 4, 4, 4];
// and once reversed it is
wordArray = [4, 4, 4, 3, 2, 2, 2, 19, 10, 1];
// this is why you end up with wordArray[0] == 4

В заключение ваши номера сортируются как строки.

Чтобы их отсортировать как числа, в порядке убывания, в вашей функции вы должны сделать:

wordArray.sort(function(a, b) { return b - a; });

Вы также можете реализовать всю функцию как однострочный:

function findLongestWord(str) {
  return str.split(/\s+/).sort(function(a, b) { return b.length - a.length; })[0].length;
}

console.log("Longest word length = ", findLongestWord("The default sort order is according to string Unicode code points"));

console.log("Longest word length = ", findLongestWord("What if we try a super-long word such as otorhinolaryngology"));

Ответ 2

Ваша функция сортировки сортирует массив лексически, поэтому вы получаете

[1,10,19,2,2,2,3,4,4,4]

изменив это, вы получите

[4,4,4,3,2,2,2,19,10,1]

где 4 - первое число

Вам вообще не нужна сортировка, просто используйте Math.max вместо

function findLongestWord(str) {
    return Math.max.apply( null, str.split(" ").map( (x) => x.length) );
}

Ответ 3

Немного отличается от вашего кода, но это должно иметь тот же результат!

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

console.log(longestWord("The quick brown fox jumped over the lazy dog"));
console.log(longestWord("What if we try a super-long word such as otorhinolaryngology"));

Ответ 4

Вы можете получить массив длин слов и затем использовать Math.max.apply

function findLongestWord(str){
  return Math.max.apply(null, str.split(" ").map(x=>x.length));
}

var l = findLongestWord("What if we try a super-long word such as otorhinolaryngology")

console.log(l)

Ответ 5

function findLongestWord(str) {
  return str.split(' ').reduce((m, w) => Math.max(m, w.length), 0);
}

var result = findLongestWord('The quick brown fox jumped over the lazy dog');
console.log(result);

Ответ 6

лучший подход к проблеме (на мой взгляд) с использованием map и max:

function findLongestWord(str) {
    return Math.max.apply(null, str.split(" ").map(function(word){
        return word.length;
    }));
}

Ответ 7

Вам не нужно использовать массив. Если вы хотите сохранить самое длинное слово, сравните самый длинный размер с текущим размером слова

function findLongestWord(str) {
  var charArray = str.split(" ");
  var longestWord = 0;

  for (var i = 0; i < charArray.length; i++) {
    let l = charArray[i].length;
    if (l > longestWord)
      longestWord = l;
  }
  return longestWord;
}

console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));
console.log(findLongestWord("What if we try a super-long word such as otorhinolaryngology"));

Ответ 8

Самый короткий путь:

console.log(
  'What if we try a super-long word such as otorhinolaryngology'
  .split(' ')
  .sort(function(a, b) {
    return b.length - a.length
  })[0].length
);

Ответ 9

вам нужно передать функцию для сортировки:

function findLongestWord(str) {

  var charArray = str.split(" ");
  var wordArray = [];


  for(var i = 0; i < charArray.length; i++ ) {
    wordArray.push(charArray[i].length);
    wordArray.sort(function(a,b){
        return a > b;
    });
    wordArray.reverse();

  }

  return wordArray[0];
}

var longest = findLongestWord("What if we try a super-long word such as otorhinolaryngology");

Ответ 10

Функция sort будет сортировать массив лексикографическим способом, который вам не нужен. Вам также нужно передать метод сортировки, если вы хотите совершенную сортировку по возрастанию для чисел. Кроме того, вы сортируете и реверсируете массив в цикле for, поэтому выполняете его каждый раз, когда элемент добавляется.

Вместо этого вы должны:

for(var i = 0; i < charArray.length; i++ ) {
    wordArray.push(charArray[i].length);
  }

wordArray.sort(ascendingSort);
wordArray.reverse();

function ascendingSort(a, b) {
    return a - b;
}

return wordArray[0];

Ответ 11

Вместо того, чтобы нажимать длины и сортировать их, попробуйте следующее

 function findLongestWord(str) {

  var charArray = str.split(" ");
  var longestWordLength = 0;
  var longestWord = "";

  for(var i = 0; i < charArray.length; i++ ) {
    if(charArray[i].length > longestWordLength){
      longestWordLength = charArray[i].length;
      longestWord = charArray[i]
    }
  }
  return {longestWord , longestWordLength};
}