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.

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ố 09 và 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

  1. Đọc xâu \(s\).
  2. Khởi tạo chuỗi kết quả res rỗng.
  3. Duyệt từng ký tự c trong \(s\):
    • Nếu c là chữ số ('0' <= c <= '9'), nối c vào res.
  4. Nếu res rỗng, in -1; ngược lại in res.

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ểu unsigned 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

Mới nhất
Tải bình luận...

Không có bình luận nào.