javascript - 使用javascript中的嵌套for循环返回一串单词中重复次数最多的字母

标签 javascript nested-loops

有几个类似的问题,但是,我不是要搜索特定的字符或字母,也不是要查找具有重复字母的第一个单词。另外,我想直接用 javascript 来做这件事。

我正在尝试构建一个函数,它将字符串作为输入,遍历字符串中的每个单词并返回具有最多重复字母的单词。如果有多个单词具有相同数量的重复字母(无论是 1 个还是更多)我想返回多个单词。

这是我目前所拥有的,但它返回字符串中的所有单词,而不是仅返回字母重复次数最多的单词。我无法弄清楚如何只返回重复次数最多的单词:

function repeatedLetterCounter(str) {
  str = str.toLowerCase();
  var wordArray = str.split(" ");

  var results = [];
  for (var i = 0; i < wordArray.length; i++) {
    var countNew = 0;
    var count = 0;
    var word = wordArray[i];
    for (var a = 0; a < word.length; a++) {
      var letter = word[a];
      for (var b = a + 1; b < word.length; b++) {
        var nextLetter = word[b];
        if (letter === nextLetter) {
          countNew += 1; 
        }
      }
    }
        if (countNew > count) {
          count = countNew;
          results.push(wordArray[i]);
        } else if (countNew === count) {
          results.push(wordArray[i]);
        }
  }
  return results;
}
console.log(repeatedLetterCounter("No, Bob ran across the Mississippi."));

这是我的 fiddle .

最佳答案

我不会从头开始生成新代码,而是获取您的代码并显示问题所在:

1。为什么您的代码返回所有单词

看看这段代码,我在其中隐藏了一些部分:

  for (var i = 0; i < wordArray.length; i++) {
    var count = 0;
    // two nested loops open and close here //
    // ...
    if (countNew > count) {
      count = countNew;
      results.push(wordArray[i]);
      // ...
    }
  }

此代码显示在每次迭代中您将 count 重置为零,因此末尾的 if 将始终为真。结果,您得到了结果中的所有单词。

2。计数器太高

当你增加 countNew 时,即使你已经在检查下一个字符,你也会继续增加它,所以最后它会计算你正在查看的单词中所有字母重复的总数,而不区别。

3。计数水平

您目前使用 2 个计数变量,但实际上需要 3 个:

  • count:在任何单词中找到的最大重复次数
  • countThisWordsBestLetter:在当前单词中找到的最高重复
  • countLetter:当前单词中当前字母的重复次数

4。更正代码

function repeatedLetterCounter(str) {
    str = str.toLowerCase();
    var wordArray = str.split(" ");

    var results = [];
    var count = 0;
    for (var i = 0; i < wordArray.length; i++) {
        var word = wordArray[i];
        var countThisWordsBestLetter = 0;
        for (var a = 0; a < word.length; a++) {
            var countLetter = 0;
            var letter = word[a];
            for (var b = a + 1; b < word.length; b++) {
                var nextLetter = word[b];
                if (letter === nextLetter) {
                    countLetter += 1; 
                }
            }
            if (countLetter > countThisWordsBestLetter) {
                countThisWordsBestLetter = countLetter;
            }
        }
        if (countThisWordsBestLetter > count) {
            // forget any words we gathered before:
            results = [];
        }
        if (countThisWordsBestLetter >= count) {
            count = countThisWordsBestLetter;
            results.push(wordArray[i]);
        }
    }
    return results;
}
console.log(repeatedLetterCounter("No, Bob ran across the Mississippi."));
// for this snippet only:
document.write( JSON.stringify(repeatedLetterCounter("No, Bob ran across the Mississippi.")));

关于javascript - 使用javascript中的嵌套for循环返回一串单词中重复次数最多的字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256783/

相关文章:

javascript - 单击按钮后我无法重置 vue 数据?

javascript - 循环遍历 Backbone $el 中的 tr 元素

javascript - 如何收集 div 内的所有复选框元素?

python - Itertools : `for a in b: for c in b`

javascript - 需要重构帮助

javascript - 单击时隐藏 Bootstrap 导航折叠

perl - 如何在没有硬编码循环的情况下创建多个列表的组合?

java - 餐厅菜单 : how to efficiently implement a nested loop to collect user input and conduct error checking

java - 如何在方法中编写嵌套 for 循环(干净的代码)

c# - 如何计算值在同一数组中重复出现的次数?