Đếm kí tự số trong xâu
Đề bài
Cho một xâu $S$ gồm các chữ cái, chữ số và dấu cách. Hãy đếm xem trong xâu có bao nhiêu kí tự là chữ số (từ 0 đến 9).
Dữ liệu vào:
Một dòng duy nhất là xâu $S$.
Kết quả:
In ra số kí tự chữ số có trong $S$.
Giới hạn:
- $1 \le |S| \le 10^6$
Giới hạn thời gian: 1 giây, bộ nhớ: 256 MB. Dữ liệu nhập từ bàn phím và in ra màn hình.
vinhdinhcoder 20184thptvinhdinh0- Ví dụ 1: có 4 kí tự số là
2,0,1,8.
Nguồn: phỏng theo bài "ĐẾM KÍ TỰ SỐ" – vinhdinhcoder.net (chủ đề Xâu kí tự).
Lời mở đầu
Đếm các kí tự từ '0' tới '9' trong xâu. Bài giúp em nắm một ý quan trọng: kí tự cũng là số (mã ASCII), nên có thể so sánh c >= '0' && c <= '9'. Ghi chú: ví dụ của đề gốc có dấu cách (vinhdinhcoder 2018) nên mình ghi rõ xâu gồm chữ cái, chữ số và dấu cách; độ dài $|S| \le 10^6$.
Bấm vào nút bên dưới để nộp bài và được hệ thống CLUE OJ chấm tự động.
Nộp bài trên CLUE OJLộ trình lời giải, bấm vào từng phần để nhảy tới:
Bộ testBộ test chính thức có gì?
Bộ test có 20 test, mỗi test đúng được 1 phần điểm như nhau. Test 1–10 ngắn, test 11–20 sinh ngẫu nhiên dài tới $10^6$ kí tự.
| Test | Nội dung kiểm tra |
|---|---|
| 1–2 | Ví dụ của đề |
| 3–10 | Xâu ngắn: chỉ có 0, không có chữ số, đủ 10 chữ số, nhiều chữ số 0 liền nhau, chữ số xen kẽ chữ cái |
| 11–20 | Xâu dài tới $10^6$ với tỉ lệ chữ số khác nhau (0%, 1%, … 100%) và có dấu cách |
Ý tưởngSo sánh kí tự theo khoảng
Các kí tự '0', '1', …, '9' có mã ASCII liên tiếp (48 tới 57). Vì vậy c là chữ số khi và chỉ khi
c >= '0' && c <= '9'
Duyệt từng kí tự, thoả điều kiện thì tăng biến đếm.
2018 có 4 kí tự số chứ không phải "1 số". Và đừng quên chữ số 0!Em nhập xâu rồi bấm Tiếp:
Lời giảiVòng for và một biến đếm
Đọc cả dòng bằng getline – xâu có dấu cách.
- C++ có sẵn hàm
isdigit(c)cho kết quả tương tự; Python cóc.isdigit(). - Đừng nhầm với
isalnum– hàm này đúng cho cả chữ cái lẫn chữ số.
Kết quả chạy thật: bản C++ đúng 20/20 test, chạy lâu nhất 0.021s. Bản Python đúng 20/20 test, chạy lâu nhất 0.152s. Full điểm.
Cái bẫyNhững cách làm sai hay gặp
Các cách làm sai mình đã chấm thử trên bộ test:
| Cách làm sai | Đúng | Ghi chú |
|---|---|---|
Đọc bằng cin >> s | 7/20 | sai test 1, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18, 19, 20 |
Điều kiện c >= '1' (quên chữ số 0) | 3/20 | sai test 1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20 |
Dùng isalnum (đếm cả chữ cái) | 3/20 | sai test 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20 |
| Đếm số "con số" (nhóm chữ số liền nhau) | 5/20 | sai test 1, 5, 6, 7, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20 |
Tổng kếtKết quả chạy thật trên bộ test
| Cách | Ngôn ngữ | Đúng | Lâu nhất | Ghi chú |
|---|---|---|---|---|
| Lời giải chuẩn | C++ | 20/20 | 0.021s | Full điểm |
| Python | 20/20 | 0.152s | Full điểm | |
| cin >> s | C++ | 7/20 | – | Mất 13 test |
| Quên '0' | C++ | 3/20 | – | Mất 17 test |
| isalnum | C++ | 3/20 | – | Mất 17 test |
| Đếm nhóm số | C++ | 5/20 | – | Mất 15 test |
'0'..'9', 'a'..'z', 'A'..'Z'.- Không biết học gì trước, học gì sau, học lan man nên kiến thức bị hổng.
- Bí bài không ai gỡ, ngồi cả buổi vẫn không ra rồi bỏ cuộc.
- Code chạy được nhưng không đủ điểm, không biết sai ở đâu, chậm ở đâu.
- Không có đề thi thử và người chấm, nên không biết mình đang ở mức nào.
- Dễ nản giữa chừng khi không có ai theo sát.
- Lộ trình 111 buổi video sắp sẵn từ dòng code đầu tiên đến đề HSG thật của các tỉnh.
- Thầy trực tiếp gỡ bí, chữa bài cho từng em qua nhóm Zalo riêng.
- Hệ thống chấm bài tự động 24/7 và thi thử HSG hằng tuần để biết chính xác mình đang ở đâu.
- Đóng học phí một lần, thầy kèm lâu dài: từ thi chuyên Tin đến HSG quốc gia và cả khi lên đại học.
Nhận xét
Đăng nhận xét