【问题标题】:Finding a first letter most repeated in an string查找字符串中重复次数最多的第一个字母
【发布时间】:2019-05-06 04:51:15
【问题描述】:

晚上好,我继续解释我的情况。我开始对开始涉足的 javascript 产生兴趣 在这门语言中,我一直在做一些在线课程,我遇到过以下任务,基本上我正在尝试通过条件“for”告诉我字符串的第一个重复字母是什么,还添加了函数“.UpperCase()”一开始效果最好,直到在这种情况下我在字符串中输入了更多字符“x”将我作为输出结果“未定义”而不是“重复最多的单词是:X”达到字符串应该考虑所有的情况字母,无论它们是小写还是大写字母,我寻求帮助以了解¿是否有另一种方式?完成这项任务,从而继续前进(对不起我的英语不好)

我用 Atom 编辑器在 JavaScript 中完成这项任务

var word = "SQSQSQSSaaaassssxxxY";
var contendor = [];
var calc = [];
var mycalc = 0;

function repeat() {
  for (var i = 0; i < word.length; i++) {
    if (contendor.includes(word[i])) {} else {
      contendor.push(word[i])
      calc.push(0)
    }
  }
  for (var p = 0; p < word.length; p++) {
    for (var l = 0; l < contendor.length; l++) {
      if (word[p].toUpperCase() == word[l]) {
        calc[l] = calc[l] + 1
      }
    }
  }
  for (var f = 0; f < calc.length; f++) {
    if (calc[f] > mycalc) {
      mycalc = calc[f]
    }
  }
}
repeat()

console.log("The first letter repeated its: " + contendor[mycalc])

我希望字符串的输出是:“X”

但实际输出是:“未定义”

【问题讨论】:

    标签: javascript arrays string loops


    【解决方案1】:

    脚本中的第一个错误是您在mycalc 中存储了错误的值:

      mycalc = calc[f]
    

    既然你想让mycalc 成为一个索引,那么上面应该是

      mycalc = f
    

    现在,您将得到一个结果,但您的代码实际上要花费大量精力来找到重复 最频繁 大写 字符,而不是 第一

    你的比较应该在比较的两边都使用toUpperCase,否则小写字母永远不会匹配。

    要获得重复最频繁的字符,您可以使用Map(像在calc 中一样跟踪计数):

    function mostRepeated(str) {
        const map = new Map;
        let result;
        let maxCount = 0;
        for (let ch of str) {
            ch = ch.toUpperCase();
            let count = (map.get(ch) || 0) + 1;
            map.set(ch, count);
            if (count > maxCount) {
                maxCount = count;
                result = ch;
            }
        }
        return result;
    }
    
    var word = "MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY";
    console.log(mostRepeated(word));

    请注意,您应该更好地使用函数参数和局部变量。将变量声明为全局变量并不是最佳做法。

    【讨论】:

    • 感谢您的帮助,我需要了解更多的功能和参数以及“地图”的使用,它非常有趣,我试着看看这个。
    【解决方案2】:

    您可以通过以下方式找到字符串中出现次数最多的字母:

    1. 首先创建一个映射,将每个唯一字母与其在字符串中出现的次数相关联
    2. 将该映射转换为“键/值”条目数组,然后按“计数值”对这些条目进行排序
    3. 返回计数最多的“字母键”

    在 JavaScript 中表达这一点的一种方法是通过以下方式:

    function findMaxLetter(word) {
    
      /* Create a map that relates letters to the number of times that letter occours */
      const letterCounts = Array.from(word).reduce((map, letter) => {
        
        return { ...map, [letter] : (map[letter] === undefined ? 0 : map[letter] + 1) }
        
      }, {})
      
      /* Sort letters by the number of times they occour, as determined in letterCounts map */
      const letters = Object.entries(letterCounts).sort(([letter0, count0], [letter1, count1]) => {
        
        return count1 - count0
        
      })
      .map(([letter]) => letter)
      
      /* Return letter that occoured the most number of times */
      return letters[0]
    }
    
    console.log("The first letter repeated its: " + findMaxLetter("MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY"))

    【讨论】:

      【解决方案3】:

      我这是为您提供最详细的解决方案

      function func( word ){
      
          word = word.toLowerCase();
      
          var i, charCountCache = {};
      
          //store all char counts into an object
          for( i = 0; i < word.length; i++){
      
            if( charCountCache[ word[ i ] ] )
              charCountCache[ word[ i ] ] = charCountCache[ word[ i ] ] + 1;
            else
              charCountCache[ word[ i ] ] = 1;
          }
      
          //find the max value of char count in cached object
          var fieldNames = Object.keys( charCountCache )
          , fieldValues  = Object.values( charCountCache )
          , mostReapeatChar = '', mostReapeatCharCount = 0;
      
      
            for( i = 0; i < fieldNames.length; i++ ){
      
              if( mostReapeatCharCount < fieldValues[i] ){
                mostReapeatCharCount = fieldValues[i];
                mostReapeatChar = fieldNames[i];
              }
      
            }    
      
          console.log('most repeating char: ', mostReapeatChar, ' no of times: ', mostReapeatCharCount )
        }
      

      【讨论】:

        【解决方案4】:

        console.log("The first letter repeated its: " + contendor[mycalc]) 您尝试打印只有 9 个值的 contendor 的第 14 个索引,这就是您的日志结果未定义的原因。

        您可能想打印word[mycalc]

        此外,如果您打算将 x 计为 X,您应该将 toUpperCase() 添加到您处理/遍历的每个字母中。

        这只是对代码中问题的说明,有更好/更快/更清洁的解决方案可以达到我相信其他答案会提供的结果。

        【讨论】:

          【解决方案5】:

          我的建议是创建一个哈希图,例如 letter =&gt; [indexLetter1, indexLetter2].

          从该哈希图中,您可以轻松找到第一个重复的字母。

          对于那个字符串MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY,hashmap 看起来像

          [
              M => [0,5,..],
              B => [1, ..],
              X => [2, ..],
              ...
          ]
          

          现在您可以在其数组中找到具有多个值的每个字母,然后在这些数组中取值最低的那个。

          【讨论】:

            【解决方案6】:

            如果要获取重复字母最多的index,可以使用Array.from将单词转换成数组。添加地图函数,将所有字母变为大写。

            使用reduceObject.entries 获取每个字母的计数

            使用indexOf 获取数组中字母的索引。请注意indexOf从0开始计数。

            var word = "MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY";
            var letters = Array.from(word, o => o.toUpperCase());
            var [highestLetter, highestCount]= Object.entries(letters.reduce((c, v) => (c[v] = (c[v] || 0) + 1, c), {})).reduce((c, v) => c[1] > v[1] ? c : v);
            var index = letters.indexOf(highestLetter);
            
            console.log("Most repeated letter:", highestLetter);
            console.log("Count:", highestCount);
            console.log("First Index:", index);

            【讨论】:

              猜你喜欢
              • 2018-09-18
              • 2017-11-12
              • 2017-01-04
              • 2012-11-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-05-21
              • 1970-01-01
              相关资源
              最近更新 更多