返回句子中最大单词的长度[重复]
Posted
技术标签:
【中文标题】返回句子中最大单词的长度[重复]【英文标题】: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 > prev) prev = curr.length; return prev; , 0);
【参考方案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】:使用map
和max
解决问题的更好方法(在我看来):
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) => 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;
【讨论】:
以上是关于返回句子中最大单词的长度[重复]的主要内容,如果未能解决你的问题,请参考以下文章