繁体   English   中英

查找字符串中最长的单词

[英]Find the longest word in string

我正在尝试解决这个任务 - “给定一个字符串,返回得分最高的单词。得分可以通过以下方式计算:

  • 对于每个元音,在分数上加 1 (["a", "e", "i", "o", "u", "y"])
  • 对于每个常量 ["b", "d"] 从分数中减去 1

例如,“蝴蝶”的得分为 2,我们为每个元音(“u”、“e”、“y”)加 3,为常数(“b”)减 1。 单词“day”的得分为 2(我们为“a”、“y”加 2)。 function 需要返回得分最高的单词。

到目前为止,这是我的代码:

function countVowels(string) {
  let vowels = ["a", "e", "i", "o", "u"] 
  let constants = ["b", "d"]

  let words = string.trim().split(" ")

  let highestScore = " ";
  let count =0;
  
  for(const c of words){
    for (let i=0; i<c.length; i++){

        if(vowels.includes(c[i])) {
        highestScore = c
        count++;
        }
        else if (constants.includes(c[i])) count--    
    }
}
console.log(highestScore)
return highestScore;

}

countVowels("what a beautiful day")

问题是我的代码返回句子中的最后一个词,而不是得分最高的词。 如果我通过“多么美好的一天”,function 返回“一天”而不是“美丽”。 我似乎找不到返回正确值的方法。 任何建议和帮助表示赞赏。

您需要另一个变量来跟踪您正在迭代的一个单词的分数,与目前找到的最高分数分开。 更精确的变量名称也会有所帮助 - highestScore听起来像一个数字(分数),但您当前的代码将它作为一个字符串。 考虑使用类似bestWordFoundSoFar的东西。

 function countVowels(string) { const vowels = ["a", "e", "i", "o", "u"] const constants = ["b", "d"] const words = string.trim().split(" ") let bestWordSoFar; let scoreOfBestWordSoFar = 0;; for (const word of words) { let thisWordScore = 0; for (const char of word) { if (vowels.includes(char)) thisWordScore++; else if (constants.includes(char)) thisWordScore-- } if (thisWordScore > scoreOfBestWordSoFar) { bestWordSoFar = word; scoreOfBestWordSoFar = thisWordScore } } return bestWordSoFar; } console.log(countVowels("what a beautiful day"));

.reduce可以使用一种更实用的方法来跟踪并返回找到的最佳单词。

 function countVowels(string) { const vowels = ["a", "e", "i", "o", "u"]; const constants = ["b", "d"]; const getWordScore = (word) => { let thisWordScore = 0; for (const char of word) { if (vowels.includes(char)) thisWordScore++; else if (constants.includes(char)) thisWordScore-- } return thisWordScore; }; return string.trim().split(" ").reduce((bestWordSoFar, word) => getWordScore(word) > getWordScore(bestWordSoFar)? word: bestWordSoFar); } console.log(countVowels("what a beautiful day"));

您不会重置分数 ( count ) 以将其个性化为每个单词。 您可以使用Array#map来执行此操作,如下所示:

 function countVowels(string) { let vowels = ["a", "e", "i", "o", "u"] let constants = ["b", "d"] let words = string.trim().split(" ") const scores = words.map(word => { let score = 0; for (let i=0; i < word.length; i++){ if(vowels.includes(word[i])) { score++ } else if (constants.includes(word[i])) score-- } console.log( word, score ); //output each word and score return [word, score]; }).sort((a,b) => b[1] - a[1]); //sort the array in descending order of score return scores[0][0]; //return the WORD with highest score } console.log('Word with highest score: ' + countVowels("what a beautiful day") );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM