查找字符串中最重复的第一个字母

时间:2019-05-06 04:51:15

标签: javascript arrays string loops

晚上好,我继续解释我的情况。我开始对开始涉足的javascript感兴趣  用这种语言,我一直在做一些在线课程,遇到了以下任务,基本上我正在尝试通过条件“ for”告诉我字符串的第一个重复字母是什么,同时添加了功能“ .UpperCase()”在开始时效果最好,直到在这种情况下我在字符串中输入了更多字符为止“ x”使我成为输出结果“ undefined”而不是“最重复的单词是:X”达到了字符串应考虑所有字母,无论它们是小写字母还是大写字母,我都需要帮助以了解是否还有另一种方法?为此任务而前进(对不起我的英语不好)

好吧,我使用Atom Editor在JavasScript中完成此任务

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”

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

6 个答案:

答案 0 :(得分:0)

如果要获得重复次数最多的字母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);

答案 1 :(得分:0)

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

  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"))

答案 2 :(得分:0)

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

您可能想打印word[mycalc]

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

这仅是代码中问题的注释,有更好/更快/更干净的解决方案可以达到结果,我相信其他答案也会提供。

答案 3 :(得分:0)

这是最适合您的解决方案

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 :(得分:0)

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

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

对于该字符串MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY,哈希图看起来像

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

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

答案 5 :(得分:0)

脚本中的第一个错误是您在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));

请注意,您最好使用函数参数和局部变量。将变量声明为全局变量不视为最佳做法。