Как посчитать гласные, согласные, цифры и специальные символы в строке

Строка — это последовательность символов. Символы могут быть буквами (гласными или согласными), цифрами или специальными символами (включая пробелы и знаки препинания). В этой статье объяснено, как посчитать количество каждого типа символов за один проход по строке, приведены примеры и готовые решения на нескольких языках.
Примеры для понимания задачи
Пример 1: Пусть строка “Welcome 2 #MUO”.

s = “Welcome 2 #MUO”
- Гласных: 5 (e, o, e, U, O)
- Согласных: 5 (W, l, c, m, M)
- Цифр: 1 (2)
- Специальных символов: 3 (# и два пробела)
Важно: пробел считается специальным символом в этом разборе.
Пример 2: Пусть строка “This Is @ InpuT String 2”.
s = “This Is @ InpuT String 2”
- Гласных: 5 (i, I, I, u, i)
- Согласных: 12 (T, h, s, s, n, p, T, S, t, r, n, g)
- Цифр: 1 (2)
- Специальных символов: 6 (@ и пять пробелов)
Подход (один проход)
Краткая идея:
- Инициализируем счётчики: гласные, согласные, цифры, спецсимволы = 0.
- Проходим по строке посимвольно.
- Для каждого символа определяем, является ли он буквой, цифрой или иным символом.
- Для букв переводим в нижний регистр и проверяем принадлежность к набору русских/латинских гласных (в этом примере — английские гласные a,e,i,o,u). Увеличиваем соответствующий счётчик.
- Для цифр увеличиваем счётчик цифр.
- Всё остальное считаем специальными символами (включая пробел, табуляцию и знаки).
Асимптотика: O(n) по времени и O(1) по дополнительной памяти (пара счётчиков).
На что обратить внимание (особые случаи)
- Unicode: стандартный подход выше опирается на сравнения диапазонов ASCII. Для строк с буквами вне ASCII (кириллица, диакритика) требуется использовать библиотеки Unicode-aware (например, ICU, Python str.isalpha() + проверка набора гласных для языка).
- Языковая локаль: набор гласных для русского языка отличается (а, е, ё, и, о, у, ы, э, ю, я). Учитывайте язык входных данных.
- Пробелы и управляющие символы здесь отнесены к спецсимволам — при необходимости можно вынести пробелы в отдельную категорию.
C++: реализация
Ниже — корректный пример на C++ (исходный код форматирован и оставлен на английском языке в теле программы):
#include
using namespace std;
void countCharactersCategory(string s)
{
int totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;
for (int i = 0; i < s.length(); i++)
{
char c = s[i];
// Alphabets family
if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') )
{
// Converting character to lower case
c = tolower(c);
// Vowels
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
totalVowels++;
}
// Consonants
else
{
totalConsonants++;
}
}
// Digits family
else if (c >= '0' && c <= '9')
{
totalDigits++;
}
// Special characters family
else
{
totalSpecialCharacters++;
}
}
cout << "Total no. of vowels in the given string: " << totalVowels << endl;
cout << "Total no. of consonants in the given string: " << totalConsonants << endl;
cout << "Total no. of digits in the given string: " << totalDigits << endl;
cout << "Total no. of special characters in the given string: " << totalSpecialCharacters << endl;
}
// Driver code
int main()
{
// Test case: 1
string s1 = "Welcome 2 #MUO";
cout << "Input string: " << s1 << endl;
countCharactersCategory(s1);
// Test case: 2
string s2 = "This Is @ InpuT String 2";
cout << "Input string: " << s2 << endl;
countCharactersCategory(s2);
return 0;
} Вывод этого примера соответствует приведённым выше примерам.
Исправленный и понятный Python-пример
Оригинальная версия Python в исходнике содержала ошибки форматирования. Ниже — исправленный и читабельный вариант, учитывающий ASCII-буквы. Для поддержки Unicode используйте методы str.isalpha() и отдельный список гласных языка.
def count_characters_category(s):
total_special_characters = 0
total_digits = 0
total_vowels = 0
total_consonants = 0
vowels = set('aeiouAEIOU')
for c in s:
# Alphabets family (ASCII letters)
if ('a' <= c <= 'z') or ('A' <= c <= 'Z'):
if c in vowels:
total_vowels += 1
else:
total_consonants += 1
# Digits family
elif '0' <= c <= '9':
total_digits += 1
# Special characters family
else:
total_special_characters += 1
print("Total no. of vowels in the given string:", total_vowels)
print("Total no. of consonants in the given string:", total_consonants)
print("Total no. of digits in the given string:", total_digits)
print("Total no. of special characters in the given string:", total_special_characters)
# Driver code
s1 = "Welcome 2 #MUO"
print("Input string:", s1)
count_characters_category(s1)
s2 = "This Is @ InpuT String 2"
print("Input string:", s2)
count_characters_category(s2)Совет: чтобы поддерживать символы Unicode (например, кириллицу), замените проверки диапазонов на c.isalpha() и сравнивайте с набором гласных конкретного языка.
C: реализация
Ниже — C-реализация, аналогичная C++ версии и использующая функции из ctype.h:
#include
#include
#include
void countCharactersCategory(char s[])
{
int totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;
for (int i = 0; i < strlen(s); i++)
{
char c = s[i];
// Alphabets family
if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') )
{
// Converting character to lower case
c = tolower(c);
// Vowels
if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
{
totalVowels++;
}
// Consonants
else
{
totalConsonants++;
}
}
// Digits family
else if (c >= '0' && c <= '9')
{
totalDigits++;
}
// Special characters family
else
{
totalSpecialCharacters++;
}
}
printf("Total no. of vowels in the given string: %d\n", totalVowels);
printf("Total no. of consonants in the given string: %d\n", totalConsonants);
printf("Total no. of digits in the given string: %d\n", totalDigits);
printf("Total no. of special characters in the given string: %d\n", totalSpecialCharacters);
}
// Driver code
int main()
{
char s1[] = "Welcome 2 #MUO";
printf("Input string: %s\n", s1);
countCharactersCategory(s1);
char s2[] = "This Is @ InpuT String 2";
printf("Input string: %s\n", s2);
countCharactersCategory(s2);
return 0;
} JavaScript: реализация
Простой пример на JavaScript, который выполняет подсчёт и выводит результаты в консоль (подходит для Node.js или браузерной консоли):
function countCharactersCategory(s) {
var totalSpecialCharacters = 0, totalDigits = 0, totalVowels = 0, totalConsonants = 0;
for (var i = 0; i < s.length; i++) {
var c = s[i];
// Alphabets family
if ( (c >= "a" && c <= "z") || (c >= "A" && c <= "Z") ) {
// Converting character to lower case
c = c.toLowerCase();
// Vowels
if (c == "a" || c == "e" || c == "i" || c == "o" || c == "u") {
totalVowels++;
}
// Consonants
else {
totalConsonants++;
}
}
// Digits family
else if (c >= "0" && c <= "9") {
totalDigits++;
}
// Special characters family
else {
totalSpecialCharacters++;
}
}
console.log("Total no. of vowels in the given string:", totalVowels);
console.log("Total no. of consonants in the given string:", totalConsonants);
console.log("Total no. of digits in the given string:", totalDigits);
console.log("Total no. of special characters in the given string:", totalSpecialCharacters);
}
// Test case: 1
var s1 = "Welcome 2 #MUO";
console.log("Input string:", s1);
countCharactersCategory(s1);
// Test case: 2
var s2 = "This Is @ InpuT String 2";
console.log("Input string:", s2);
countCharactersCategory(s2);Альтернативные подходы и улучшения
- Регулярные выражения: можно использовать regex, чтобы искать сразу все цифры (\d), пробелы (\s) или буквы (\p{L} при поддержке Unicode). Regex упрощает код, но может быть медленнее для очень больших строк в некоторых реализациях.
- Unicode-aware: для многоязычных приложений используйте методы, распознающие буквы Unicode, и набор гласных для нужной локали.
- Разделение пробелов отдельно: если важно знать количество пробелов — заведите отдельный счётчик.
- Параллельная обработка: для очень длинных строк можно разбить на чанки и обрабатывать параллельно (требует аккуратного суммирования счётчиков).
Набор тестов и критерии приёмки
Критерии приёмки:
- Корректно считает для пустой строки (все счётчики = 0).
- Корректно считает только латинские буквы и цифры (в соответствии с текущей реализации).
- Корректно обрабатывает строки с пробелами и знаками.
- Для Unicode-тестов (кириллица) — если функция должна поддерживать Unicode, проходит тесты с русскими гласными и согласными.
Тест-кейсы:
- “” → 0,0,0,0
- “AEIoU” → гласные = 5
- “12345” → цифры = 5
- “ ,.!?” → спецсимволы = 5
- “Привет” (при поддержке Unicode) → считает буквы русского алфавита
Чеклист для интервью (роль: кандидат на позицию инженера)
- Объяснить асимптотику O(n).
- Уметь перечислить варианты для Unicode и локализации.
- Показать как изменить код, чтобы считать пробелы отдельно.
- Привести альтернативу на regex и обсудить плюсы/минусы.
- Написать быстрый тестовый набор и показать результаты на примерах.
Краткая методология (шаги для реализации в задаче)
- Определить требования: ASCII или Unicode, считать пробелы отдельно или как спецсимвол.
- Выбрать языковую реализацию.
- Реализовать проход по строке с набором счётчиков.
- Добавить юнит-тесты и кейсы границ.
- Профилировать для больших данных при необходимости.
Короткий глоссарий
- Гласные: буквы, которые обозначают звуки голоса (англ.: a,e,i,o,u).
- Согласные: буквенные символы, не вошедшие в набор гласных.
- Спецсимволы: все символы, не являющиеся буквами или цифрами (включая пробелы).
Итог
Подсчёт типов символов в строке — простая задача, которую удобно решать за один проход по строке. Основные сложности возникают при работе с Unicode и при различной трактовке пробелов/управляющих символов. В статье приведены готовые реализации и рекомендации по тестированию и расширению решения.
Важно: если вы ожидаете входные данные на другом языке (не английском), адаптируйте набор гласных или используйте Unicode-aware методы для корректной классификации.
Похожие материалы
CSS font-family: как менять шрифты на сайте
График амортизации кредита в Excel — пошагово
Разгон Raspberry Pi 4 — безопасный пошаговый гид
Как запустить Windows 11 на Mac — варианты и советы
Мошенничество с возвратом средств через техподдержку