我写了一个函数,它接收一个句子并计算该句子中最长的单词。
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函数按词法对数组进行排序,因此您最终得到
[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) );
}
TL;DR
您的数字被排序为字符串。
要在函数中按降序将它们排序为数字,您应该这样做:
wordArray.sort(function(a, b) { return b - a; });
根据文档:
sort()方法对数组中的元素进行排序并返回数组。排序不一定是稳定的。默认排序
[…]
语法
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"));
与您的代码略有不同,但应该具有相同的结果!
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"));
你可以得到一个单词长度的数组,然后使用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)
使用map
和max
来解决这个问题(在我看来):
function findLongestWord(str) {
return Math.max.apply(null, str.split(" ").map(function(word){
return word.length;
}));
}
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);
最短路径:
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'))
不必使用数组。如果您只想保存最长的单词,只需将最长长度与当前单词长度进行比较
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"));
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];
你需要传递一个函数来排序:
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");
请尝试下面的
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};
}