Hướng dẫn giải của Thay chữ số
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.
Lời giải này đang bị ẩn cho đến khi bạn chọn mở ra.
Chúng tôi khuyên bạn nên tự thử giải bài trước. Việc mở lời giải có thể làm lộ mất ý tưởng chính trước khi bạn có cơ hội tự giải.
Bạn phải đăng nhập để mở lời giải này.
Đăng nhậpTác giả: , , ,
Hiểu bài toán
Bài toán yêu cầu thay thế tất cả các ký tự số '0' trong một chuỗi ký tự số bằng ký tự '5'. Input bao gồm nhiều test case, mỗi test case là một chuỗi số. Output là chuỗi tương ứng sau khi đã thay thế các ký tự '0'. Ví dụ: '10203' -> '15253'.
Các cách tiếp cận
Cách Duyệt và thay thế trực tiếp
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
freopen("replacedigit.inp", "r", stdin);
freopen("replacedigit.out", "w", stdout);
int n;
cin >> n;
while (n--) {
string s;
cin >> s;
for (char &c : s) {
if (c == '0') c = '5';
}
cout << s << "\n";
}
return 0;
}
- Time Complexity: O(N * L)
- Space Complexity: O(L)
Phương pháp này đọc từng chuỗi số và duyệt qua từng ký tự. Nếu ký tự là '0', nó được thay bằng '5'. Đây là cách tiếp cận trực quan và hiệu quả cho giới hạn độ dài chuỗi và số lượng test case thông thường. Độ phức tạp thời gian phụ thuộc vào tổng độ dài của tất cả các chuỗi.
Cách Xử lý chuỗi
#include <bits/stdc++.h>
using namespace std;
string solve(string a) {
long long dodai = a.length();
string b = a;
for (int i = 0; i < dodai; i++) {
if (b[i] == '0') {
b[i] = '5';
}
}
return b;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
freopen("replacedigit.inp", "r", stdin);
freopen("replacedigit.out", "w", stdout);
int n;
cin >> n;
for (int j = 0; j < n; j++) {
string c;
cin >> c;
cout << solve(c) << endl;
}
return 0;
}
- Time Complexity: O(L)
- Space Complexity: O(L)
Cấu trúc mã tương tự như cách tiếp cận đầu tiên, được gói gọn trong một hàm xử lý riêng. Logic vẫn là duyệt và thay thế. Việc tách hàm giúp mã nguồn dễ đọc và quản lý hơn.
Phân tích độ phức tạp
| Cách tiếp cận | Time | Space | Tên |
|---|---|---|---|
| 1 | O(N * L) | O(L) | Duyệt và thay thế trực tiếp |
| 2 | O(L) | O(L) | Xử lý chuỗi |
Bài học kinh nghiệm
- Bài toán là thao tác xử lý chuỗi cơ bản, không yêu cầu thuật toán phức tạp.
- Sử dụng tham chiếu (reference) khi duyệt chuỗi trong C++ (kiểu
char &c) giúp thay đổi trực tiếp chuỗi gốc mà không cần tạo bản sao hoặc truy cập qua chỉ số. - Cần chú ý đến định dạng input/output và các tệp tin (
.inp,.out) như yêu cầu.
Lỗi thường gặp
- Quên mở/tắt luồng input/output đúng cách (freopen) dẫn đến lỗi chạy trên các hệ thống chấm tự động có yêu cầu file.
- Thiếu các tối ưu hóa I/O (iosbase::syncwith_stdio(false); cin.tie(nullptr);) có thể gây trễ thời gian chạy nếu dữ liệu vào ra lớn.
- Lỗi cú pháp khi duyệt chuỗi (ví dụ: sai kiểu dữ liệu iterator).
Bình luận