Редакция для Буквы, цифры и прочее


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

1. Идея

Нужно пройти по строке и для каждого символа определить, к какой из трёх групп он относится:

  • латинская буква;
  • цифра;
  • прочий символ.

Для каждой группы заведём отдельный счётчик и увеличиваем его при просмотре очередного символа.


2. Наблюдения

  1. Латинские буквы — это только символы от a до z и от A до Z.

  2. Цифры — это символы от 0 до 9.

  3. Всё остальное относится к прочим символам:

    • пробелы;
    • знаки препинания;
    • специальные символы.
  4. Строка может содержать пробелы, поэтому в C++ нужно читать её через getline, а не через cin >> s.

  5. Длина строки может быть до 2 * 10^5, поэтому нужен линейный алгоритм: один проход по строке.


3. Алгоритм

  1. Считать всю строку.
  2. Создать три переменные:
    • letters = 0
    • digits = 0
    • other = 0
  3. Для каждого символа c в строке:
    • если c — латинская буква, увеличить letters;
    • иначе если c — цифра, увеличить digits;
    • иначе увеличить other.
  4. Вывести letters, digits, other.

4. Почему это работает

Мы рассматриваем каждый символ строки ровно один раз.

Для любого символа возможны только три варианта:

  1. он является латинской буквой;
  2. он является цифрой;
  3. он не подходит ни под одно из этих условий, значит относится к прочим.

Эти случаи не пересекаются и вместе покрывают все возможные символы строки. Поэтому каждый символ будет учтён ровно в одном счётчике.

После завершения прохода:

  • 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)

Комментарии

Еще нет ни одного комментария.