Làm cách nào tôi có thể tìm thấy các từ dài nhất trong chuỗi và trả lại những từ đó (không bao gồm các từ trùng lặp) cùng với độ dài tối đa?


8

Tôi biết làm thế nào tôi có thể tìm thấy từ dài nhất trong một chuỗi. Ví dụ mã này ở đây. Nhưng vấn đề ở đây là từ "bbbbbb" được tìm thấy bởi vì anh ta là người làm việc lâu nhất trong chuỗi, sau đó với 6 ký tự, chúng ta cũng có từ "nhảy". Câu hỏi của tôi là làm thế nào tôi có thể tìm thấy trong trường hợp này và từ "nhảy", vì vậy tất cả chúng không chỉ là từ đầu tiên.

CẬP NHẬT: Tôi muốn danh sách duy nhất, vì vậy chỉ một trong mỗi từ

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


Cố gắng sentence.filter(w => w.length === longest)để có được một mảng các từ với độ dài đó.
Rafi

Bạn có thể thử tạo một mảng để giữ các từ dài nhất mà bạn thêm vào. Sau đó, bạn có thể sử dụng bộ lọc () hoặc map () để đánh giá độ dài và thêm vào mảng.
CoderLee

Bây giờ bạn có hai câu trả lời với các từ duy nhất: Yevhen'sFZs
mplungjan

Câu trả lời:


9

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


Đẹp một để có được chiều dài trong một tuyên bố. Tôi cần nhiều hơn vì .sort không trả về mảng
mplungjan

3
@LuisfelipeDejesusMunoz Tại sao không thêm một lời giải thích nào? Thật tốt cho những độc giả khác tìm thấy câu trả lời này. Ngoài OP.
CoderLee

@YevgenGorbunkov Solutuon của bạn cũng rất tuyệt. Cảm ơn người bạn đời
Trajce12

Giải pháp trên không bỏ qua các từ trùng lặp và thuật toán được triển khai là không tối ưu vì nó không cần thiết phải có 2 lần đi qua mảng trong khi phương pháp vượt qua đơn có thể đạt hiệu suất tốt hơn khoảng 15% ngay cả đối với chuỗi thử nghiệm ngắn như vậy.
Yevgen Gorbunkov

@YevgenGorbunkov Bạn nói đúng về hiệu suất, nhưng tôi không chắc liệu OP có muốn nhận các từ duy nhất hay không (phần đó đã được chỉnh sửa trong câu hỏi của người khác )
FZs

2

Bạn có thể thực hiện một cách tiếp cận vòng lặp duy nhất và kiểm tra phần cuối của mỗi từ với độ dài tích lũy của mục đầu tiên.

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


@mplungjan: Thú vị làm thế nào các phong cách khác nhau thu hút những người khác nhau. Tôi thấy đây là một trong những câu trả lời dễ đọc hơn. Tất nhiên có lẽ đó là vì nó giống với câu trả lời tôi đã viết ... nhưng không được công bố vì Nina đã đánh bại tôi.
Scott Sauyet

2

Bạn có thể làm điều đó Array.prototype.reduce()bằng một lần đi qua mảng (không cần lặp thêm để tính chiều dài tối đa).

Ý tưởng là thiết lập lại mảng kết quả bằng một từ duy nhất, khi độ dài của nó vượt quá các mảng được chèn trước hoặc nối thêm nếu từ hiện tại xảy ra có cùng độ dài hoặc đơn giản là vượt qua:

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


Thật là một đức tính tốt khi cho phép một noob hiểu những gì đang diễn ra quá :)
mplungjan

Tôi muốn nói stackoverflow.com/a/60153437/295783 này dễ đọc hơn. Có ý kiến ​​gì không?
mplungjan

3
Chim nhạn lồng nhau là gớm ghiếc và nguy hiểm. Nhiệm vụ của bạn cho các giải pháp dòng đơn sẽ khiến người viết mã sau khi bạn ghét bạn thời gian lớn :)
mplungjan

Tôi thấy giảm không quá tuyệt vời để cập nhật nhiều giá trị cùng nhau (trong trường hợp này lengthwords).
Gershom

1

Bạn có thể làm điều đó bằng cách giảm sentencemảng.

Ưu điểm của phương pháp này là nó chỉ lặp lại trên mảng một lần:

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

Hoặc, nếu bạn muốn lọc các từ trùng lặp, bạn có thể trả lại Setthay thế:

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


Đây là mức giảm dễ đọc nhất được đăng cho đến nay
mplungjan

Chỉ có thể upvote một lần. Những ví dụ tuyệt vời
mplungjan

0

Những gì bạn có thể làm là kiểm tra xem độ dài của từ lớn hơn hoặc bằng độ dài của mục đầu tiên của mảng (Tất cả các mục trong mảng phải có cùng độ dài).

Nếu vậy, sau đó kiểm tra nếu nó là lớn hơn. Nếu đó là sự thật, thì hãy đặt mảng thành từ đó, vì bạn đã tìm thấy một từ lớn hơn các từ trong mảng. Mặt khác, thêm nó vào mảng các từ có độ dài lớn nhất.

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


0

Nó cũng có thể được thực hiện trong giảm duy nhất.
Khởi xướng với đối tượng.

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

Cách tiếp cận này không có độ phức tạp thời gian tốt hơn câu trả lời tốt nhất ở đây, nhưng nó có hệ số tốt hơn. (Nó chỉ lặp trên mảng các từ một lần, không có hàm nào gọi ngoại trừ 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(' ')));

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.