Нахождение первой буквы, наиболее повторяющейся в строке - PullRequest
1 голос
/ 06 мая 2019

Добрый вечер, я приступаю к объяснению своей ситуации.Я начал интересоваться javascript, который начал баловаться этим языком, я проходил некоторые онлайн-курсы, с которыми я столкнулся при выполнении следующей задачи, в основном я пытаюсь выполнить условие «для», скажите мне, что является первым повторным письмомВ строку также добавляется функция «.UpperCase ()», которая в начале работала лучше всего, пока я не ввел в строку больше символов, в этом случае «x» выдает меня в качестве выходного результата «undefined» вместо «самого повторяющегося слова: X»«дойти до случая, когда строка должна учитывать все буквы независимо от того, являются ли они строчными или заглавными буквами, для чего я прошу помощи, чтобы понять, есть ли другой способ?для этой задачи и, следовательно, двигаться вперед (извините за мой плохой английский)

Ну, я делаю эту задачу в JavasScript с редактором Atom

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"

, но фактический вывод: "Undefined"

Ответы [ 6 ]

0 голосов
/ 06 мая 2019

Первая ошибка в вашем скрипте состоит в том, что вы сохраняете неправильное значение в mycalc:

  mycalc = calc[f]

Поскольку вы хотите, чтобы mycalc был index , вышеприведенноебыл

  mycalc = f

Теперь вы получите результат, но ваш код на самом деле прикладывает немало усилий, чтобы найти символ в верхнем регистре , который чаще всего повторяется , а не first .

В вашем сравнении следовало использовать 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));

Обратите внимание, что вам лучше использовать параметры функции и локальные переменные.Объявление ваших переменных как глобальных не считается лучшей практикой.

0 голосов
/ 06 мая 2019

Мой совет - создать хеш-карту, такую ​​как letter => [indexLetter1, indexLetter2].

. Из этой хеш-карты вы можете легко найти свои первые повторяющиеся буквы.

Для этой строки MBXAYMZAXmZYxxxxxxxxxxmBxAYMZaXmZY хеш-карта будетвыглядит как

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

, теперь вы можете найти каждую букву с несколькими значениями в своем массиве, затем в этих массивах взять одну с наименьшим значением.

0 голосов
/ 06 мая 2019

Это наиболее подробное решение для вас

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 )
  }
0 голосов
/ 06 мая 2019

console.log("The first letter repeated its: " + contendor[mycalc]) Вы пытались напечатать 14-й индекс contendor, который имеет только 9 значений, поэтому ваш результат журнала был неопределенным.

Возможно, вы хотели напечатать word[mycalc].

Кроме того, если вы намеревались считать x как X, вам следует добавлять toUpperCase () к каждому письму, которое вы обрабатываете / проходите.

Это только примечание к проблемам в вашемкод, есть лучшие / более быстрые / чистые решения для достижения результата, который, я уверен, предоставят другие ответы.

0 голосов
/ 06 мая 2019

Вы можете найти букву, которая встречается в строке больше всего раз:

  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"))
0 голосов
/ 06 мая 2019

Если вы хотите получить index самой повторяющейся буквы, вы можете использовать Array.from для преобразования слова в массив.Добавьте функцию карты, чтобы все буквы были заглавными.

Получите счетчик каждой буквы, используя reduce и Object.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);
...