Сколько слов на доске
Условие
На классной доске дежурный переписывал тему урока. Он торопился и ставил пробелы как попало: мог поставить несколько подряд, а мог начать строку с пробелов.
Считай, сколько слов получилось в строке. Словом считается максимальный подряд идущий фрагмент не из пробелов.
Формат ввода
Одна строка длины от 1 до 2000 символов. В строке могут быть пробелы и любые непробельные символы.
Формат вывода
Выведите одно целое число — количество слов в строке.
Ограничения
- 1 ≤ длина строки ≤ 2000
- Разрешены ведущие/хвостовые пробелы и несколько пробелов подряд
Пример
Ввод:
Математика физика информатика
Вывод:
3Как решать — идея подхода
Приём: Однопроходный автомат (флаг «в слове»)
Ключевое наблюдение: слово — это максимальный подряд идущий кусок НЕ из пробелов. Значит, слова начинаются ровно в тех позициях, где текущий символ не пробел, а предыдущий был пробелом (или это самый первый символ строки).
Удобный приём — пройти строку один раз, держа флаг in_word: находимся ли мы сейчас внутри слова. Как только встречаем непробельный символ и при этом in_word == False, значит началось новое слово — увеличиваем ответ и ставим in_word = True. Если встречаем пробел — выходим из слова (in_word = False).
План:
- Считать строку (если читаете через
input(),\nуже убран; если черезreadline(), можно убрать последний\n). - Завести
cnt = 0иin_word = False. - Для каждого символа
ch: - если
ch != ' 'иnot in_word, то это старт нового слова:cnt += 1,in_word = True; - если
ch == ' ', тоin_word = False. - Вывести
cnt.
Мини-сниппет логики старта слова: if ch != ' ' and not in_word: cnt += 1; in_word = True
Сложность: O(n) по времени и O(1) по памяти, где n — длина строки.
Частая ошибка: делать s.split(' ') — при нескольких пробелах подряд появятся пустые элементы, и их легко случайно посчитать как слова. Если хочется через split, то безопаснее s.split() без аргумента, но однопроходный вариант надёжнее и не зависит от деталей.
Разберись руками
Есть строка: «Математика␠␠физика␠информатика». Слова — это куски из НЕ-пробелов, между ними могут быть даже несколько пробелов. Нужно посчитать, сколько таких кусков получилось.
- Отметь в строке индексы (с 0) тех символов, с которых НАЧИНАЕТСЯ новое слово. То есть это НЕ пробел, и слева от него либо начало строки, либо пробел.
- Что из этого точно означает «мы нашли новое слово»?
- Сколько начал слов ты отметил(а) на шаге 1? Введи это число — это и будет количество слов.
Идея: Идём по строке слева направо и считаем моменты, когда начинается новый «кусок без пробелов»: текущий символ не пробел, а слева был пробел или это самое начало строки. Количество таких стартов и есть число слов.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- БВИ и льготы при поступлении — какой диплом что даёт и сколько лет он действует
- Перечневые олимпиады по информатике — олимпиады перечня Минобрнауки, их уровни и что нужно к диплому