【问题标题】:Returning the length of largest word in a sentence [duplicate]返回句子中最大单词的长度[重复]
【发布时间】:2017-03-30 16:40:35
【问题描述】:

我写了一个函数,它接收一个句子并计算该句子中最长的单词。

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

【问题讨论】:

  • .sort() 不像您期望的那样工作。尝试为它提供一个回调,以正确排序您的数字。
  • 去掉wordArray,reverse();会有什么结果
  • 你实际上根本不需要wordArray。在每一步,只需将当前长度与maxLen(初始设置为 0)进行比较并相应更新。
  • 你不需要排序是O(n log n)操作来按条件查找单个元素。
  • 你可以一行。 return str.split(' ').reduce(function(prev, curr) { if (curr.length &gt; prev) prev = curr.length; return prev; }, 0);

标签: javascript


【解决方案1】:

您的 sort 函数按词法对数组进行排序,因此您最终得到

[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) );
}

【讨论】:

    【解决方案2】:

    TL;DR

    您的数字被排序为字符串。

    要让它们按数字降序排列,在你的函数中你应该这样做:

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

    解释

    根据the docs

    sort() 方法对数组的元素进行就地排序并返回 数组。排序不一定是stable默认排序 顺序是根据字符串 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
    

    您还可以将整个功能实现为单线:

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

    【讨论】:

      【解决方案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】:

        使用mapmax 解决问题的更好方法(在我看来):

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • reduce 在这里更自然arr.reduce((m, w) =&gt; Math.max(m, w.length), 0)
          【解决方案7】:

          最短路径:

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

          或者作为一个函数:

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

          【讨论】:

          • OP 想要返回最大单词的长度,而不是排序单词的数组。
          • @Gavin 哎呀,你是对的。我会纠正的。
          【解决方案8】:

          您不必使用数组。如果只想保存最长的单词,只需将最长的大小与当前的单词大小进行比较

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

          【讨论】:

            【解决方案9】:

            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];
            

            【讨论】:

            • 看起来是这样。我错误地认为字典排序就足够了,因为这些是数字,而不仅仅是字符串。我将编辑我的答案以避免混淆。
            【解决方案10】:

            你需要传递一个函数来排序:

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

            【讨论】:

              【解决方案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};
              }
              

              【讨论】:

                猜你喜欢
                • 2020-07-12
                • 1970-01-01
                • 2014-02-23
                • 1970-01-01
                • 2014-10-06
                • 1970-01-01
                • 2021-06-16
                • 2016-06-29
                • 2023-03-04
                相关资源
                最近更新 更多