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

 — — Directions
Write a function that returns the number of vowels used in a string. Vowels are the characters ‘a’, ‘e’, ‘i’, ‘o’, and ‘u’.
 — — Examples
vowels(‘Hello There!’) → 4
vowels(‘What’s up?’) → 2
vowels(‘Why?’) → 0

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

Поскольку имя нашей функции уже vowels, мы не можем так назвать нашу переменную. Вместо этого мы будем использовать термин checkedVowels, поскольку мы будем проверять, присутствуют ли эти символы в нашей строке.

Я предлагаю сделать checkedVowels массив вместо строки при решении подобных задач, потому что это обеспечивает большую гибкость при проверке значений. Например, если вам нужно было проверить подстроки или многосимвольные строки, такие как “abc”, вы не смогли бы это сделать со строковой переменной.

После создания checkedVowels следующим шагом будет создание пустого массива с именем strVowels для представления гласных, найденных в строковом аргументе.

Настроив переменные средства проверки и отслеживания, мы можем начать итерацию по нашему строковому аргументу. Используя выражение for…of, мы проверим, является ли каждый символ или char гласным. Однако в нашем for…of заявлении мы будем использовать метод JavaScript String .toLowerCase(). Этот метод преобразует каждый символ в строке в строчную букву, избавляя нас от необходимости проверять наличие заглавных гласных.

В каждой итерации нашего for…of оператора мы будем использовать другой встроенный метод JavaScript, называемый .includes(), чтобы проверить, является ли char гласной. Метод .includes() определяет, включает ли массив определенное значение среди своих записей, возвращая true, если это так, и false, если нет. Если наш .includes() метод возвращает true для текущего символа, тогда мы push превратим этот символ в strVowels.

После того, как вся строка будет повторена, мы return strVowels.length выйдем за пределы цикла. Это гарантирует, что мы получим количество гласных в данной строке, тем самым решив проблему.

Эту проблему также можно решить, используя переменную счетчика вместо strVowels. При использовании переменной-счетчика просто увеличивайте count каждый раз, когда будет найдена гласная, вместо того, чтобы вставлять гласную в массив. После завершения итераций return count правильно решить эту проблему.

Решение с помощью Regex

Другой способ решить эту проблему - использовать регулярные выражения или Regex. Регулярные выражения - это шаблоны, используемые для сопоставления комбинаций символов в строках. Используя Regex, эта проблема становится намного проще и может быть решена всего за две строки.

Regex обычно используется с методом JavaScript String .match(), который извлекает результаты сопоставления строки с регулярным выражением. Это означает, что .match() вернет строку всех символов, которые соответствуют выражению Regex, переданному в качестве аргумента.

Чтобы гарантировать, что matches захватывает каждую гласную в пределах str, нам нужно добавить два параметра в конец нашего регулярного выражения: g и i.

Регулярное выражение g гарантирует, что .match() не остановится на первом значении, которое соответствует строке, для которой оно было вызвано. Регулярное выражение i означает нечувствительный, что означает нечувствительность к регистру. Это означает, что .match() будет игнорировать чувствительность к регистру каждого символа, что устраняет необходимость использовать .toLowerCase().

Вы можете подумать, что мы можем просто return matches теперь, когда мы собрали все гласные в пределах str, но у нас еще есть еще один шаг.

Метод .match() возвращает строку символов, которая соответствует результату выражения Regex, но если совпадающих символов нет, .match() возвращает null. Поскольку проблема заключается в запросе количества гласных, найденных в данной строке, нам нужно будет создать проверку, является ли matches null.

Мы будем использовать троичное выражение , чтобы проверить, является ли matches истинным значением, поскольку null считается ложным. Если matches правдиво, мы будем return matches.length, но если matches ложно, мы будем return 0.

Вывод

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