繁体   English   中英

使用此代码在 JS 中查找字符串中最长的单词?

[英]Find the longest word in a string in JS using this code?

请让我知道这段代码有什么问题:

我知道有更简单的方法可以达到预期的结果,但是我想了解如何使这个特定的代码运行,以及我的错误是什么。 尝试尽可能少地改变它,否则让我知道为什么这不起作用。 另请注意,我正在尝试console.log 3 个值,而不仅仅是一个。 谢谢你。

编辑:这是我实际测试代码是否有效的freeCodeCamp练习: https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-algorithm-scripting/find-the-字符串中最长的单词出于某种原因,大多数答案都在此处的代码段中起作用,但在 freeCodeCamp 练习控制台中却不起作用?

 function findLongestWordLength(str) { let arr = []; let longestWord = ""; let longestNum = 0; /*If there is a character at str[i] add it to the arr, else if there is whitespace don't add it to the arr. Instead, find the arr.length, if is greater than the previous overwrite longestNum, longestWord and empty the arr, if not just empty the arr and keep going*/ for (let i = 0; i <= str.length - 1; i++) { if (/./i.test(str[i])) { arr.push(str[i]); } else if (/\s/.test(str[i])) { if (arr.length - 1 >= longestNum) { longestNum = arr.length - 1; longestWord = arr.join(""); arr = []; } else { longestNum = longestNum; longestWord = longestWord; arr = []; } } } console.log(arr); console.log(longestWord); console.log(longestNum); return longestNum; } findLongestWordLength("The quick brown fox jumped over the lazy dog");

我假设使用/./i.test(str[i])您正在尝试匹配除空格之外的所有内容。 . 匹配除换行符之外的所有内容,因此我将其切换为[^\s] ,它实际上匹配除空格之外的所有内容。 我还将控制台日志置于循环之外,因此 output 有点可读。

function findLongestWordLength(str) {

  let arr = [];
  let longestWord = "";
  let longestNum = 0;

  for (let i = 0; i <= str.length - 1; i++) {
    if (/[^\s]/i.test(str[i])) {
      arr.push(str[i]);
    } else if (/[\s]/i.test(str[i])) {
      if (arr.length > longestNum) {
        longestNum = arr.length;
        longestWord = arr.join("");
        arr = [];
      } else {
        longestNum = longestNum;
        longestWord = longestWord;
        arr = [];
      }
    }

  }
  console.log(arr); // last word since you reset arr every step
  console.log(longestWord);
  console.log(longestNum);
  return longestNum;
}

findLongestWordLength("The quick brown fox jumped over the lazy dog");

更好的方法是:

function findLongestWordLength(sentence) {
  const words = sentence.split(' ');
  return words.reduce((max, currentWord) => max > currentWord.length ? max : currentWord.length, 0);
}

只需进行最少的修改,您就需要进行以下更改:

  • 确保最后一个单词的长度也得到验证。 目前不是。 为此,您可以在执行循环之前向输入字符串添加一个空格。
  • 更改测试/./i ,因为它将匹配除换行符之外的任何内容 你会想要检查字母,可能还有数字,也许还有下划线,但不是标点符号。 所以/\w/将是一个改进。 你可以想出更好的正则表达式。 浏览器正在慢慢获得对/\p{L}/u的支持,它可以匹配任何字母表中的字母。
  • 应该删除else中的测试,因为您只想无条件地处理这里的任何其他情况 例如,逗号也将分隔单词,并且在下一个单词开始之前可能没有空格。
  • 不要从数组长度中减去 1:它确实具有单词的字符(仅),因此您需要完整长度。

这些是使其正确的最小更改:

 function findLongestWordLength(str) { let arr = []; let longestWord = ""; let longestNum = 0; str += " "; // trick to ensure that the last word is also inspected for (let i = 0; i <= str.length - 1; i++) { if (/\w/i.test(str[i])) { // match alphanumerical character, not anything. // The `i` suffix doesn't harm, but is useless here arr.push(str[i]); } else { // Remove any condition here. if (arr.length >= longestNum) { // you need the full length, not minus 1 longestNum = arr.length; // (idem) longestWord = arr.join(""); arr = []; } else { longestNum = longestNum; // not needed longestWord = longestWord; // not needed arr = []; } } //console.log(arr); //console.log(longestWord); //console.log(longestNum); } return longestNum; } console.log( findLongestWordLength("The quick brown fox jumped over the lazy dog") )

如您所知,有更短的方法可以做到这一点,例如使用这个函数式编程解决方案:

 function findLongestWordLength(str) { return Math.max(...str.match(/\w+|$/g).map(s => s.length)); } console.log(findLongestWordLength("The quick brown fox jumped over the lazy dog"));

只要字符不是空格( /\S/ - 大写 S),您就需要添加项目。 如果是空格,则需要将长度与之前的longestWord.length进行比较,并将单词赋值给longestWord 在空间的情况下,您初始化arr

注意:作业longestNum = longestNum; longestWord = longestWord; longestNum = longestNum; longestWord = longestWord; 是多余的,它们已经与它们自己相等。 此外, longestNum也是多余的,因为它是从longestWord ( longestWord.length ) 派生的。

 function findLongestWordLength(str) { let arr = []; let longestWord = ""; for (let i = 0; i < str.length; i++) { if (/\S/.test(str[i])) { // as long as it's not a space arr.push(str[i]); } else { if (arr.length > longestWord.length) { longestWord = arr.join(""); } arr = []; } } return longestWord.length; } var result = findLongestWordLength("The quick brown fox jumped over the lazy dog"); console.log(result);

如果您在第一个测试中使用稍微不同的正则表达式,则可以省略else if(..)条件: /\w/ ,寻找单词中可能出现的任何字符。

 function findLongestWordLength(str) { let arr = [], longestWord = "", longestNum = 0; for (let i = 0; i <= str.length - 1; i++) { if (/\w/.test(str[i])) { arr.push(str[i]); } else { if (arr.length - 1 >= longestNum) { longestNum = arr.length - 1; longestWord = arr.join(""); arr = []; } else { longestNum = longestNum; longestWord = longestWord; arr = []; } } } console.log(arr); console.log(longestWord); console.log(longestNum); return longestNum; } var str="The quick brown fox jumped over the lazy dog"; findLongestWordLength(str); // alternatively you could simply do: console.log(str.split(/\s/).sort((a,b)=>b.length-a.length)[0])

arr的内容当然是最后测试的单词,在本例中是“dog”。 有两个长度为 5 的字符串,只找到第一个。

正如您在我的片段中看到的那样,一种更短的方法是:

var longestWord=str.split(/\s/).sort((a,b)=>b.length-a.length)[0]

我会参考上述关于重组和冗余的优秀答案,但也会补充(因为 OP 需要解释)这里使用的大多数(如果不是全部)正则表达式/拆分方法将推送单词并包括前导/尾随标点符号,或拆分单词错误地。

使用\w通过连字符和单引号进行拆分,这可能会产生误导性结果,具体取决于您的需要。

例如“你好……?” 长度比“longest”长,计算所有标点符号。 “你是”也是一个词,而不是两个词,因此用空格分隔或仅依赖\w是有问题的。

将文本内容拆分为单词时(如果是文字处理,我想这是一个家庭作业问题)不仅要依赖空格。 我在当前尚未发布的项目中使用此正则表达式: /[\s.,:;??_<>{}()[\]"`´^$°§½¼³%&¬+=*~#|/\\]/

上面的正则表达式允许连字符的单词,虽然从技术上讲,多个单词连接在一起,但通常被阅读/视为一个单词,即在创建一个 janky-type-comund-noun 时,就像我刚才所做的那样。

最后,语言很重要。 使用上面的正则表达式分割文本内容对英语来说效果很好,并且不会用单引号字符分割单词,因为那样我们会分割“你是个骗子!” ["you", "re", "a", "liar"]中,所以你仍然需要清理周围单引号的结果数组(同样,可能是多个,也许用户写了 "'Good晚上。'''"错误)。

总结:做 NLP (自然语言处理)的一个基本部分应该几乎总是涉及“文本清理”步骤并依赖空格或内置\w特殊字符,即使只是在处理英文文本时,也不会削减它。

暂无
暂无

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

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