Hướng dẫn giải của NAME
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng dẫn giải
Với mỗi tên riêng, tách thành các từ, viết hoa chữ cái đầu của mỗi từ, các chữ còn lại viết thường, rồi nối các từ bằng đúng một khoảng trắng. Các khoảng trắng đầu, cuối và thừa giữa các từ bị bỏ đi.
Sub 1: Duyệt từng ký tự — ~O(L)~
Duyệt từng ký tự của tên (L là độ dài tên). Khi gặp ký tự sau một khoảng trắng thì viết hoa, còn lại viết thường; khoảng trắng liên tiếp chỉ in một lần, khoảng trắng đầu tiên bị bỏ qua. Đạt 10/10 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
string line;
getline(cin, line); // bỏ phần xuống dòng sau số n
while (n--) {
getline(cin, line);
// Duyệt từng ký tự: gặp đầu từ thì viết hoa, các ký tự còn lại viết thường,
// khoảng trắng liên tiếp chỉ in ra một lần và bỏ qua khoảng trắng đầu/cuối
string res;
bool startOfWord = true;
for (char c : line) {
if (c == '\r') continue;
if (c == ' ') {
startOfWord = true;
} else {
if (!res.empty() && startOfWord) res += ' ';
res += startOfWord ? (char)toupper(c) : (char)tolower(c);
startOfWord = false;
}
}
cout << res << "\n";
}
return 0;
}
Sub 2: Tách từ bằng stringstream — ~O(L)~
Dùng stringstream để đọc từng từ (tự bỏ khoảng trắng thừa), viết hoa chữ đầu, còn lại viết thường, rồi nối lại có đúng một khoảng trắng giữa các từ. Đạt 10/10 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
string line;
getline(cin, line); // bỏ phần xuống dòng sau số n
while (n--) {
getline(cin, line);
// stringstream tự tách các từ, bỏ mọi khoảng trắng thừa ở đầu, cuối và giữa các từ
stringstream ss(line);
string word, res;
while (ss >> word) {
// Viết hoa chữ cái đầu, các chữ còn lại viết thường
for (size_t i = 0; i < word.size(); i++)
word[i] = (i == 0) ? toupper(word[i]) : tolower(word[i]);
if (!res.empty()) res += ' ';
res += word;
}
cout << res << "\n";
}
return 0;
}
Bình luận