Сколько раз буква «i» встречается в штате Миссисипи? А как насчет «s» и «p»? Какой из них появляется чаще всего? В этом блоге мы рассмотрим, как найти наиболее часто используемый символ в строке - вопрос, который может возникнуть в вашем следующем техническом собеседовании.

Эта проблема - отличный пример понимания использования объектов JavaScript, в частности, как получить доступ и управлять значениями внутри объектов. Он также проверяет ваши знания о циклах JavaScript, например знание разницы между for… of и for… in. Наиболее важным свойством объектов, которое необходимо понять при ответе на этот вопрос, является использование пар ключ-значение. Когда в коде вызывается ключ, он возвращает указанное значение. Вот небольшой фрагмент кода, в котором я запрашиваю цену на яблоко в объекте price:

Вы можете вызвать значение ключа внутри объекта, используя обозначение object [key]. Обратите внимание, что переданный ключ является строкой. Если бы мне нужна была цена на апельсины, я бы просто набрал price [апельсины], и он вернул бы строку 3 доллара. Следующим важным шагом в понимании является создание цикла с использованием for… of и for… in. Я объяснил… или кратко в предыдущем сообщении блога под названием Алгоритмы JavaScript: простое обращение строки, поэтому, если вы забыли, что он делает, не стесняйтесь вернуться и проверить его! > for… in цикл немного отличается, поскольку он не выполняет итерацию по итерируемым объектам, таким как строка или массивы. Согласно документации MDN, цикл for… in выполняет итерацию по всем перечислимым свойствам объекта, для которых используются строковые ключи. Это означает, что если мы пытаемся получить доступ только к значениям определенных ключей в объекте, цикл for… in - это правильный путь.

Один из подходов к этому решению - создать объект JavaScript, в котором символы используются в качестве ключей, а его использование считается значениями. Как только этот объект создается с использованием данной строки, мы перебираем объект, чтобы найти наибольшее значение, а затем возвращаем его ключ. Звучит просто по объяснению ... и к тому же он должен быть довольно простым в исполнении. Давайте начнем!

Для данной строки вернуть символ, который чаще всего используется в этой строке. Например, если строка - «яблоко», функция вернет «p». Если слово - «данные», функция вернет «а».

Чтобы ответить на этот вопрос, я собираюсь создать пустой объект с именем stringObj. Этот объект будет нести все пары ключ-значение, где каждый символ строки является ключом, а частота этого символа - значением. Для этого мне нужно перебрать данную строку, используя цикл for… of. Я также собираюсь создать две переменные: одну для хранения текущего максимального значения, а другую для хранения текущего символа.

Поначалу логика цикла может показаться немного запутанной, поэтому давайте рассмотрим ее вместе. В прайс-листе ранее я говорил о том, как мы можем ссылаться на значение, используя нотацию object [«key»]. Первая часть условия вызывает объект-ключ и устанавливает его текущее значение плюс один. Если мы не можем добавить единицу к указанному значению, то вместо этого мы установим единицу. Это необходимо для тех случаев, когда персонаж еще не добавлен к объекту. Итак, возьмем для примера строку: «привет». Первый символ цикла for… of - «h». Мы хотим добавить этот символ к объекту stringObj, установив stringObj [«h»] равным 1. Поскольку это значение еще не существует, попытка ссылки на него вернет undefined, что является значением false-y, поэтому логическое ИЛИ Оператор (||) срабатывает и устанавливает для неопределенного значения значение 1. Если мы встретим еще одну букву «h» ниже по строке, поскольку указанное значение теперь содержит значение «1» и больше не является неопределенным, оно будет инкремент вместо того, чтобы быть установленным на 1. Этот цикл будет перебирать каждый отдельный символ в данной строке и создавать пару ключ-значение для каждого символа, помещая их внутри объекта stringObj.

Следующий шаг - найти символ с наибольшим значением / частотой. Ранее мы инициализировали maxValue и maxChar для представления значения и символа соответственно. Теперь нам нужно выполнить итерацию по объекту stringObj и соответственно обновить значения maxValue и maxChar. Именно здесь цикл for… in имеет решающее значение.

Этот цикл for… in перебирает каждый символьный ключ внутри stringObj и проверяет, не превышает ли его значение maxValue. Если оно больше maxValue, maxValue изменяется на значение символа, а затем maxChar изменяется на символ с maxValue. Это звучит немного запутанно, но в следующем примере это будет иметь больше смысла.

Предположим, у нас есть строка «abbcccddddeeeee». Если мы запустим нашу функцию maxChar, после того, как наш цикл for… of будет выполнен (первый цикл в нашем коде), у нас будет объект stringObj, который выглядит следующим образом:

Очевидно, мы можем сказать, что буква «е» - самая распространенная буква, просто взглянув на нее, но что, если бы строка была значительно длиннее? Вот почему мы перебираем объект и соответственно обновляем наши maxChar и maxValue. При первом запуске цикла for… in значение maxChar будет равно «a», а maxValue будет равно «1». Во второй раз, поскольку значение «b» больше, чем «a», maxChar заменяется на «b», а maxValue будет изменено на «2». Это продолжается до тех пор, пока не будет повторен весь цикл.

В самом конце нашей функции вы не можете забыть, что мы хотим ответить на вопрос! Для этого мы должны вернуть maxChar, который теперь будет наиболее часто используемым символом в строке. В приведенном выше примере мы получили бы возвращаемое значение «e».

Вот полное решение кода. Попробуйте просмотреть каждую строчку и посмотреть, имеет ли она смысл.

На самом деле есть аналогичные вопросы, которые имеют почти тот же подход, что и это решение, например, использование анаграмм («Имеет ли строка A такое же количество и тип символов, что и строка B?») И повторяющихся символов («Есть ли в данной строке символы повторять в нем? »). Все, что связано с подсчетом или сравнением символов в строке, является довольно хорошим показателем того, когда использовать объекты для поиска решения.

Я надеюсь, что этот блог оказался полезным в вашем понимании использования объектов JavaScript. В блоге на следующей неделе я собираюсь объяснить один из самых распространенных вопросов на собеседовании всех времен: FizzBuzz! Это также один из моих личных фаворитов, потому что он действительно помог мне понять оператор по модулю JavaScript.

Вот предварительный просмотр вопроса. Попробуйте сами, если хотите!

Напишите функцию, которая выводит число от 1 до x. Однако вы должны соблюдать следующие правила:

Для каждого кратного 3 выведите «fizz» вместо числа.
Для каждого кратного 5 выведите «buzz» вместо числа.
Для каждого кратного 3 и 5 выведите «fizzbuzz» »Вместо числа.

Например, fizzBuzz(5) вернет:

1
2
fizz
4
buzz

Развлекайтесь и не забывайте делать перерывы! Помните, что это марафон, а не спринт.