Hướng dẫn cho Bài 1 (HSG 9 Hải Phòng 2022-2023)
Chỉ sử dụng khi thực sự cần thiết như một cách tôn trọng tác giả và người viết hướng dẫn này.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Chép code từ bài hướng dẫn để nộp bài là hành vi có thể dẫn đến khóa tài khoản.
Tóm tắt đề bài
Cho một xâu \(s\) chỉ gồm chữ cái latin in thường và các chữ số. Hãy in ra tất cả các ký tự chữ số theo đúng thứ tự xuất hiện trong xâu. Nếu không có chữ số nào thì in -1.
Phân tích
- Đầu vào: 1 dòng là xâu \(s\), độ dài không quá \(250\).
- Yêu cầu: lọc (filter) các ký tự là chữ số
0–9và ghép lại theo thứ tự xuất hiện. - Nhận xét:
- Bài toán rất trực tiếp: duyệt từng ký tự, kiểm tra có phải chữ số không.
- Nếu sau khi duyệt không thu được ký tự nào, in
-1.
Hướng giải quyết
Nhận xét
Một ký tự là chữ số khi nó nằm trong khoảng '0' đến '9' (hoặc dùng hàm isdigit).
Thuật toán
- Đọc xâu \(s\).
- Khởi tạo chuỗi kết quả
resrỗng. - Duyệt từng ký tự
ctrong \(s\):- Nếu
clà chữ số ('0' <= c <= '9'), nốicvàores.
- Nếu
- Nếu
resrỗng, in-1; ngược lại inres.
Lưu ý/Pitfall
- Đầu vào là một dòng, có thể dùng
getlineđể đọc an toàn (dù đề thường không có khoảng trắng). - Nếu dùng
isdigit(c)trong C++, nên ép kiểuunsigned charđể tránh hành vi không xác định với ký tự âm (không quan trọng lắm ở bài này nhưng là thói quen tốt).
Độ phức tạp
- Thời gian: \(O(n)\) với \(n\) là độ dài xâu (tối đa \(250\)).
- Bộ nhớ: \(O(n)\) cho chuỗi kết quả (trong trường hợp mọi ký tự đều là chữ số).
Code tham khảo
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
getline(cin, s);
string res;
for (char c : s) {
if ('0' <= c && c <= '9') {
res += c;
}
}
if (res.empty()) cout << -1;
else cout << res;
return 0;
}
Bình luận