好吧,所以基本上这段代码会将一个句子传递给函数,函数需要找出哪个词最长才能返回。一切都很好,除了最后一封信不断被切断。那么这个问题的解决方案是什么呢?
function LongestWord(sen) {
sen = sen.toLowerCase();
var build = "";
var arr = [];
var longest = 0;
for(var i = 0; i < sen.length;i++){
var cur = sen.charCodeAt(i);
console.log(sen.charCodeAt(i))
if(i == sen.length - 1){
arr.push(build);
}
if(sen.charAt(i) === " "){
arr.push(build);
build = "";
}
if(cur >= 97 && cur <= 122){
build += String.fromCharCode(cur);
}
}
console.log(arr);
for(var e = 0; e < arr.length - 1;e++){
if(arr[e].length > arr[e + 1].length){
longest = arr[e];
}
else{
longest = arr[e + 1];
}
}
return longest;
}
// keep this function call here
// to see how to enter arguments in JavaScript scroll down
console.log(LongestWord("Johnny ErsoL"));
它返回“Johnny”,这是正确的,但这就是数组最后的样子。
[ 'johnny', 'erso' ]
答案 0 :(得分:3)
这是我的建议吗?
function LongestWord(sen) {
return sen.split(/\b/).filter(function(item) {
return item.trim().length;
}).sort(function(a,b) {
return b.length - a.length;
});
}
将单词边界上的句子分开,然后修剪掉空格,最后按每个单词的长度排序并返回排序后的数组。
答案 1 :(得分:1)
尝试替换
for(var i = 0; i < sen.length;i++){
var cur = sen.charCodeAt(i);
console.log(sen.charCodeAt(i))
if(i == sen.length - 1){
arr.push(build);
}
if(sen.charAt(i) === " "){
arr.push(build);
build = "";
}
if(cur >= 97 && cur <= 122){
build += String.fromCharCode(cur);
}
}
与
arr=sen.split();
答案 2 :(得分:0)
你有e <arr.length -1
的for循环。我认为你不需要-1。
答案 3 :(得分:0)
我知道你已经找到了答案,但我只想告诉你一个替代你正在做的事情。
为了简化代码并使其更易理解,但也更灵活,确保每个功能只做一件事,或者只有一个责任感通常是一个好主意。
在您的代码中,您的LongestWord
函数负责识别单词和以找出哪一个最长。
你可以做的是创建一个知道如何将句子标记为单词的函数:
function forEachWordsIn(str, callback) {
var rx = /\b(\w+?)\b/g,
match;
while (match = rx.exec(str)) callback(match[0]);
}
然后使用longestWord
函数中的单词iterator函数,这使得这个算法现在非常简单:
function longestWord(sen) {
var longestWord = '';
forEachWordsIn(sen, function (word) {
if (word.length > longestWord.length) longestWord = word;
});
return longestWord;
}
注意:我将LongestWord
重命名为longestWord
,因为使用captital字母开头的函数是识别构造函数的众所周知的标准。