Редакция для Буквы, цифры и прочее
Submitting an official solution before solving the problem yourself is a bannable offence.
1. Идея
Нужно пройти по строке и для каждого символа определить, к какой из трёх групп он относится:
- латинская буква;
- цифра;
- прочий символ.
Для каждой группы заведём отдельный счётчик и увеличиваем его при просмотре очередного символа.
2. Наблюдения
Латинские буквы — это только символы от
aдоzи отAдоZ.Цифры — это символы от
0до9.Всё остальное относится к прочим символам:
- пробелы;
- знаки препинания;
- специальные символы.
Строка может содержать пробелы, поэтому в C++ нужно читать её через
getline, а не черезcin >> s.Длина строки может быть до
2 * 10^5, поэтому нужен линейный алгоритм: один проход по строке.
3. Алгоритм
- Считать всю строку.
- Создать три переменные:
letters = 0digits = 0other = 0
- Для каждого символа
cв строке:- если
c— латинская буква, увеличитьletters; - иначе если
c— цифра, увеличитьdigits; - иначе увеличить
other.
- если
- Вывести
letters,digits,other.
4. Почему это работает
Мы рассматриваем каждый символ строки ровно один раз.
Для любого символа возможны только три варианта:
- он является латинской буквой;
- он является цифрой;
- он не подходит ни под одно из этих условий, значит относится к прочим.
Эти случаи не пересекаются и вместе покрывают все возможные символы строки. Поэтому каждый символ будет учтён ровно в одном счётчике.
После завершения прохода:
lettersсодержит число всех латинских букв;digitsсодержит число всех цифр;otherсодержит число всех остальных символов.
Именно это и требуется вывести.
5. Сложность
Пусть длина строки равна n.
- Время работы:
O(n), потому что строка просматривается один раз. - Дополнительная память:
O(1), так как используются только несколько счётчиков.
6. Код на C++17
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
getline(cin, s);
int letters = 0;
int digits = 0;
int other = 0;
for (char c : s) {
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
letters++;
} else if (c >= '0' && c <= '9') {
digits++;
} else {
other++;
}
}
cout << letters << ' ' << digits << ' ' << other << '\n';
return 0;
}
7. Код на Python 3
s = input()
letters = 0
digits = 0
other = 0
for c in s:
if ('a' <= c <= 'z') or ('A' <= c <= 'Z'):
letters += 1
elif '0' <= c <= '9':
digits += 1
else:
other += 1
print(letters, digits, other)
Комментарии