在一个字符串中找到所有长度最大的单词

3

我想从字符串中找到长度最大的所有单词。

目前,结果只是最长的第一个:'jumped1',而我想要它们全部:['jumped1', 'jumped2']

我该如何修改以下代码?

function test(str) {

  var newStr = str.split(' ');
  var nu = 0;
  var word =null;

  for(var i=0; i < newStr.length; i++){
     if(newStr[i].length > nu){
       nu = newStr[i].length; // length
       word = newStr[i]; // word

     }    
  }
  return word;
}

console.log(test("The quick brown fox jumped1 over the lazy dog - jumped2"));

1
“multiple words”是什么意思?您是指以数字结尾的单词,还是要一个包含最长单词的数组? - Joe Iddon
所以,如果数组中最长的单词长度为7,则返回所有长度为7的单词吗? - vapurrmaid
是的。就是这样。 - Shanu T Thankachan
@david 请看我的回答,那就是我所描述的。 - Joe Iddon
我认为在你的if语句中使用'>='而不是'>'将返回所需的结果?并且这个 => word = newStr[i]; 将变成 word += newStr[i];。 - Mohammad Reza Farahani
显示剩余3条评论
4个回答

3

当你发现最长的单词时,不要将其分配给一个变量word,而是将其推送到最长单词的数组中。但是,在发现新的最长单词时,您必须处理清空该数组。

function test(str) {
  var split_string = str.split(' ');
  var longest_length = 0;
  var words = [];
  for(let string of split_string){
     if(string.length > longest_length){
       words = [string];
       longest_length = string.length;
     } else if (string.length == longest_length){
       words.push(string);
     }
  }
  return words;
}

console.log(test("The quick brown fox jumped1 over the lazy dog - jumped2"));


100%天才!无评论 - Shanu T Thankachan
如果答案解决了您的问题,请将其标记为已接受 - adiga

2
您可以使用 reduce 来获取最长单词的长度,然后再使用 filter 获取该长度的单词列表:

function test(str) {
  var words = str.split(' ');
  var maxLen = words.reduce(function(num, word){
    return Math.max(num, word.length);
  }, 0);
  
  return words.filter(function(word){
    return word.length == maxLen
  });
}

console.log(test("The quick brown fox jumped1 over the lazy dog - jumped2"));


这是 O(2n),但是 O(n) 是可能的。 - Joe Iddon
@JoeIddon 虽然我理解你的观点,但你没有考虑到2这个因素,请参见哪个算法更快O(N)还是O(2N)? - Nick stands with Ukraine
1
@NickA 是的,它们的执行时间都与输入大小成线性比例增长,只是我的速度始终是你的两倍快 : )。你的方法仍然很酷,所以我给你点赞! - Joe Iddon
1
理论上来说,reducefilter的执行速度比迭代要快(尽管我可能在这方面有所错误!),对于O(n)的情况也是如此。 - Nick stands with Ukraine

0
如果我理解问题正确的话,您可以在找到最大长度后使用filter来返回每个单词的数组,其中length === max

function test (str) {
  let words = str.split(' ')
  let max = 0
  words.forEach(word => {
    if (word.length > max) max = word.length
  })
  return words.filter(word => word.length === max)
}

console.log(
test("The quick brown fox jumped1 over the lazy dog - jumped2")
)


这是O(2n),但是O(n)也是可能的。 - Joe Iddon
谢谢@JoeIddon,我之前没意识到如何在一次遍历中累加 - 你的答案很优雅。 - vapurrmaid

0

您可以通过收集较长的单词或长度相同的单词来减小数组。

function test(string) {
    return string
        .split(' ')
        .reduce((r, w) => {
            if (!r || r[0].length < w.length) {
                return [w];
            }
            if (r[0].length === w.length) {
                r.push(w);
            }
            return r;
        }, undefined);
}

console.log(test("The quick brown fox jumped1 over the lazy dog - jumped2"));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接