Find the Longest Word in a String ——找出最长单词(fcc算法题)

题目:Find the Longest Word in a String(找出句子中最长单词长度)

找到提供的句子中最长的单词,并计算它的长度。

函数的返回值应该是一个数字。

提示:

解法1:通过.sort()将数组按从大到小排序

function findLongestWord(str) {
  var arr = str.split(' ');
  arr.sort(function(a,b){
    return b.length-a.length;
  });
  return arr[0].length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");

解法2: 使用for循环遍历数组,更新最大长度字符串

function findLongestWord(str) {
    var strArr = str.split(" ");
    var length = 0;
    for (var i = 0; i < strArr.length; i++) {
        // 遍历过程中,若当前字符串长度比 length 大,就更新 length
        if (strArr[i].length > length) {
            length = strArr[i].length;
        }
    }
    return length;
}

解法3:采用数组内置方法 .reduce() 来实现

function findLongestWord(str) {
    var stringArr = str.split(" ");
    return stringArr.reduce(function (prev, next) {
        // 返回值为参数与当前字符串中较大的数
        // 返回值会作为下次计算的 prev 传入
        return Math.max(prev, next.length);
    }, 0)
}

解释:

.reduce() 的第一个参数为回调,第二个参数为初始值。第二个参数可以为空

解法4:使用.map()方法和.apply()方法判断最大值

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

解释:

  • .map() 方法创建一个新数组,其结果是该数组中的每个元素调用一个提供的函数。对于这个方法,一句话概括,就是:返回等长度的,经过处理后的数组。

  • Math.max.apply() 的第一个参数是 this 指向,而关键在于第二个参数是数组或者类数组。举个例子,我们可以通过 Math.max(1, 2, 3) 得到 3,也可以通过 Math.max.apply(null, [1, 2, 3]) 来得到 3。这样,由于 .map() 那一步返回的是单词长度组成的数组,我们把这个数组扔给 Math.max.apply() 的第二个参数,就得到了那个数组的最大值

  • 由于 Math.max() 这个方法,并不依赖 context (执行上下文),因此我们只需要给第一个参数传入 null。当然,第一个参数传入 undefined 或者 Math 都是可以的。

解法5:使用递归方法

function findLongestWord(str) {
    // 分割字符串
    var stringArr = str.split(" ");
    // 边界值及递归跳出条件
    if (stringArr.length === 1) {
        return stringArr[0].length;
    }
    // 比较数组中第一个元素(字符串)与第二个元素(字符串)的长度
    if (stringArr[0].length >= stringArr[1].length) {
        // 如果第一个元素比第二个长
        // 把第二个元素删掉
        stringArr.splice(1, 1);
        // 由于 findLongestWord 接收字符串为参数,因此需要用空格 join
        return findLongestWord(stringArr.join(" "));
    }
    if (stringArr[0].length < stringArr[1].length) {
        // 如果第一个元素比第二个元素短
        // 忽略第一个元素,从第二个开始 `.join()`
        return findLongestWord(stringArr.slice(1).join(" "));
    }
}

解释:

  • 整体思路就是,每次我们只判断数组中的前两个元素

    • 如果第一个比较长,那么我们就把第二个删除(留下较长的),然后再去比较第一个和第三个
    • 如果第二个比较长,那么我们就选取数组中的第二个元素至末尾,然后继续去比较第二个和第三个
  • 这样看来,每次递归调用,数组会越来越短。那么最后留下来的,就是最长的那个字符串

  • 值得注意的是,由于 splice() 返回的是被删除的元素,而并非删除后的数组。因此我们不能直接链式调用 .join()

原题链接:Find the Longest Word in a String

解法2-解法5转自:S1ngS1ng在博文《找出最长单词 (Find the Longest word in a String)

原文地址:https://www.cnblogs.com/cq7216/p/6653763.html