Hướng dẫn giải của XÓA SỐ ( CỤM BN2)
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
Cho số nguyên dương N (N <= 10^12), xóa các chữ số 0 và 1 rồi in số còn lại. Đọc từ XOASO.INP, ghi ra XOASO.OUT.
Sub 1: Xóa từng ký tự trong xâu — ~O(L^2)~
Đọc N dưới dạng xâu, quét từ cuối về đầu và xóa mỗi ký tự 0 hoặc 1. Nếu không còn chữ số nào thì in 0. Bẫy: các test thực tế có số dài hơn 10^12 (có test 21 chữ số), nên không dùng kiểu số 64 bit. Đạt 10/10.
Kết quả chấm: đạt 10/10 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
if (fopen("XOASO.INP", "r")) {
freopen("XOASO.INP", "r", stdin);
freopen("XOASO.OUT", "w", stdout);
}
string s;
cin >> s;
// Vet can: quet tu cuoi chuoi, gap chu so 0 hoac 1 thi xoa khoi chuoi
for (int i = (int)s.size() - 1; i >= 0; i--)
if (s[i] == '0' || s[i] == '1') s.erase(i, 1);
if (s.empty()) s = "0";
cout << s << endl;
return 0;
}
Sub 2: Duyệt xâu và ghép các chữ số cần giữ — ~O(L)~
Duyệt từng ký tự của xâu, giữ các ký tự khác 0 và khác 1 vào xâu kết quả theo đúng thứ tự. Cách này không cần chuyển sang số nguyên nên không bị tràn. Đạt 10/10.
Kết quả chấm: đạt 10/10 test.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
if (fopen("XOASO.INP", "r")) {
freopen("XOASO.INP", "r", stdin);
freopen("XOASO.OUT", "w", stdout);
}
string s;
cin >> s;
string res;
// Giu lai cac chu so khac 0 va khac 1
for (char c : s)
if (c != '0' && c != '1') res += c;
if (res.empty()) res = "0";
cout << res << endl;
return 0;
}
Bình luận