Как я могу найти самые длинные слова в строке и вернуть их (исключая дубликаты) вместе с максимальной длиной? - PullRequest
8 голосов
/ 10 февраля 2020

Я знаю, как найти самое длинное слово в строке. Например этот код здесь. Но здесь проблема в том, что слово «bbbbbb» найдено, потому что он является ПЕРВЫМ ДЛИННЫМ СЛОВОМ В СТРУНЕ, после этого с 6 символами у нас также есть слово «прыжок». У меня вопрос, как я могу найти в этом случае и слово «прыгнул», поэтому все они не только первый.

ОБНОВЛЕНИЕ: я хочу уникальный список, поэтому только одно из каждого слова

function longestWord(sentence) {
  sentence = sentence.split(' ');

  let theWord = sentence[0];
  var longest = 0;
  for (let i = 0; i < sentence.length; i++) {
    if (sentence[i] != "") {
      if (sentence[i].length > theWord.length) {
        longest = sentence[i].length;
        theWord = sentence[i];
      }
    }
  }
  return {
    length: longest,
    actuallWord: theWord
  }
}
console.log(longestWord("The quick brown as bbbbbb fox jumped over the bbbbbb lazy dog"));

Ответы [ 7 ]

9 голосов
/ 10 февраля 2020

function longestWord(sentence) {
  // First we divide the sentence into words
  var words = sentence.split(' ');
  
  // We then get the length by getting the maximun value of the length of each word
  var length = Math.max(...words.map(a=>a.length));
  return {
    length: length,
    // Finally we filter our words array returning only those of with the same length we previously calculated
    words: words.filter(i => i.length == length)
  }
}
console.log(longestWord("The quick brown as bbbbbb fox jumped over the lazy dog"));
2 голосов
/ 10 февраля 2020

Вы можете выбрать один подход l oop и проверить длину каждого слова по длине аккумуляторов первого элемента.

function longestWords(words) {
    return words
        .split(/\s+/)
        .reduce((accu, word) => {
            if (!accu[0] || accu[0].length < word.length) return [word];
            if (accu[0].length === word.length) accu.push(word);
            return accu;
        }, []);
}

console.log(longestWords("The quick brown as bbbbbb fox jumped over the lazy dog"));
2 голосов
/ 10 февраля 2020

Вы можете сделать это с помощью Array.prototype.reduce() за один проход массива (без дополнительных циклов для расчета максимальной длины).

Идея состоит в том, чтобы сбросить результирующий массив одним словом, как только его длина превысит те, которые были вставлены ранее или добавляются, если текущее слово имеет одинаковую длину, или просто проходят мимо:

const src = 'The quick brown as bbbbbb fox jumped over the jumped lazy dog',

      result = src.split(' ')
                  .reduce((res, word, idx) => {
                    if(!idx || word.length > res.length)
                        res = {length: word.length, words:new Set([word])}
                    else if(word.length == res.length)
                        res.words.add(word)
                    return res
                  }, {})

console.log({result: result.length, words: [...result.words]})
.as-console-wrapper {min-height:100%}
1 голос
/ 10 февраля 2020

Вы можете сделать это, уменьшив массив sentence.

Преимущество этого подхода состоит в том, что он зацикливается на массиве только один раз:

function longestWords(sentence) {
  return sentence.split(' ').reduce((output, word) => {
    if (word.length > output.length) {
      output.words = [word]
      output.length = word.length
    } else if (word.length === output.length) {
      output.words.push(word)
    }
    return output
  }, { length: 0, words: [] })
}
console.log(longestWords("The quick brown as bbbbbb fox jumped over the lazy dog"));

Или, если вы хотите отфильтровать повторяющиеся слова, вы можете вернуть Set вместо:

function longestWords(sentence) {
  return sentence.split(' ').reduce((output, word) => {
    if (word.length > output.length) {
      output.words.clear()
      output.length = word.length
    } 
    if (word.length >= output.length) {
      output.words.add(word)
    }
    return output
  }, { length: 0, words: new Set })
}
const words = longestWords("The quick brown as bbbbbb fox jumped over the jumped lazy dog")
console.log(words.length);
console.log(Array.from(words.words)) //Just to make StackSnippets console show the Set's entries
0 голосов
/ 12 февраля 2020

Этот подход не имеет лучшей временной сложности, чем лучшие ответы здесь, но у него есть лучшие коэффициенты. (Он проходит по массиву слов только один раз, никаких вызовов функций, кроме Array.prototype.push).

let allLongestItems = items => {
  let longest = [];
  let length = 0;
  for (let item of items) {
    let len = item.length;
    if (len === length) longest.push(item)
    else if (len > length) { longest = [ item ]; length = len; }
  }
  return { items: longest, length };
};

let str = 'The quick brown as bbbbbb fox jumped over the lazy dog';
console.log(allLongestItems(str.split(' ')));
0 голосов
/ 10 февраля 2020

Это также можно сделать за один раз.
Инициируется объектом.

function longestWord(words) {
  return words
    .split(/\s+/)
    .reduce((acc, word) => {
  	if(word.length > acc.length) {
  		acc.length = word.length;
  		acc.words = [word];
  	}
  	else if (word.length === acc.length) {
  		acc.words.push(word);
  	}
  	return acc;
  }, {length:0, words:[]});
}

console.log(longestWord("The quick brown as bbbbbb fox jumped over the lazy dog"));
0 голосов
/ 10 февраля 2020

Что вы можете сделать, это проверить, является ли длина слова большей или равной длине первого элемента массива (все элементы в массиве должны иметь одинаковую длину).

Если это так, то проверьте, больше ли оно. Если это правда, тогда установите массив в это слово, потому что вы нашли слово, которое было больше, чем слова в массиве. В противном случае добавьте его в массив слов, имеющих наибольшую длину.

function longestWord(sentence) {
  sentence = sentence.split(' ');
  let theWord = sentence[0];
  var longest = 0;
  for (let i = 0; i < sentence.length; i++) {
    if (sentence[i] != "") {
      if (sentence[i].length >= theWord[0].length) {
        if (sentence[i].length > theWord[0].length) {
          longest = sentence[i].length;
          theWord = [sentence[i]];
        } else {
          theWord.push(sentence[i])
        }
      }
    }
  }
  return {
    length: longest,
    actuallWord: theWord
  }
}
console.log(longestWord("The quick brown as bbbbbb fox jumped over the lazy dog"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...