题目: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)》