Редакция для Заглавные в начале слов
Submitting an official solution before solving the problem yourself is a bannable offence.
Разбор задачи «Заглавные в начале слов»
1. Идея
Строка состоит из слов, разделённых одиночными пробелами. Нужно у каждого слова сделать первую букву заглавной, а остальные — строчными. Достаточно разбить строку по пробелам, преобразовать каждое слово и снова склеить пробелами.
2. Наблюдения
Для одного слова преобразование простое: первый символ переводим в верхний регистр, все последующие — в нижний. Пустых слов не возникает, если разделитель — ровно один пробел, но аккуратная обработка пустого слова не помешает.
3. Алгоритм
- Прочитать строку целиком (в ней есть пробелы).
- Разбить её на слова по пробелу.
- У каждого слова первую букву сделать заглавной, остальные — строчными.
- Склеить слова обратно через пробел и вывести.
4. Почему это работает
Каждое слово обрабатывается независимо, а порядок слов и одиночные пробелы между ними сохраняются, потому что мы разбиваем и склеиваем по одному и тому же разделителю. Значит, результат — та же последовательность слов, но в нужном регистре.
5. Сложность
Каждый символ строки обрабатывается ровно один раз, поэтому время и память — O(|s|).
Код на C++17
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
string s;
getline(cin, s);
string result = s;
for (int i = 0; i < (int)s.size(); i++) {
if (s[i] == ' ') {
result[i] = ' ';
} else {
if (i == 0 || s[i - 1] == ' ') {
result[i] = (char)toupper((unsigned char)s[i]);
} else {
result[i] = (char)tolower((unsigned char)s[i]);
}
}
}
cout << result << "\n";
return 0;
}
Код на Python 3
s = input()
words = s.split(" ")
res = []
for w in words:
if w:
res.append(w[0].upper() + w[1:].lower())
else:
res.append(w)
print(" ".join(res))
Комментарии