| TT | Hệ 10 (Thập phân) | Đồ hoạ (Hiển thị ra được) |
|---|---|---|
| Chữ số | 48–57 | 0–9 |
| 1 | 48 | 0 |
| 2 | 49 | 1 |
| 3 | 50 | 2 |
| 4 | 51 | 3 |
| 5 | 52 | 4 |
| 6 | 53 | 5 |
| 7 | 54 | 6 |
| 8 | 55 | 7 |
| 9 | 56 | 8 |
| 10 | 57 | 9 |
| Chữ hoa | 65–90 | A–Z |
| 1 | 65 | A |
| 2 | 66 | B |
| 3 | 67 | C |
| 4 | 68 | D |
| 5 | 69 | E |
| 6 | 70 | F |
| 7 | 71 | G |
| 8 | 72 | H |
| 9 | 73 | I |
| 10 | 74 | J |
| 11 | 75 | K |
| 12 | 76 | L |
| 13 | 77 | M |
| 14 | 78 | N |
| 15 | 79 | O |
| 16 | 80 | P |
| 17 | 81 | Q |
| 18 | 82 | R |
| 19 | 83 | S |
| 20 | 84 | T |
| 21 | 85 | U |
| 22 | 86 | V |
| 23 | 87 | W |
| 24 | 88 | X |
| 25 | 89 | Y |
| 26 | 90 | Z |
| Chữ thường | 97–122 | a–z |
| 1 | 97 | a |
| 2 | 98 | b |
| 3 | 99 | c |
| 4 | 100 | d |
| 5 | 101 | e |
| 6 | 102 | f |
| 7 | 103 | g |
| 8 | 104 | h |
| 9 | 105 | i |
| 10 | 106 | j |
| 11 | 107 | k |
| 12 | 108 | l |
| 13 | 109 | m |
| 14 | 110 | n |
| 15 | 111 | o |
| 16 | 112 | p |
| 17 | 113 | q |
| 18 | 114 | r |
| 19 | 115 | s |
| 20 | 116 | t |
| 21 | 117 | u |
| 22 | 118 | v |
| 23 | 119 | w |
| 24 | 120 | x |
| 25 | 121 | y |
| 26 | 122 | z |
| TT | Tên hàm | Ghi chú |
|---|---|---|
| 1 | S.size() |
Trả về độ dài của xâu S. Kiểu trả về: size_t (số nguyên không âm). Ví dụ: string S="Hello"; cout << S.size(); → 5
|
| 2 | S.length() |
Giống S.size(), trả về số kí tự của xâu. Kiểu trả về: size_t. Ví dụ: cout << S.length();
|
| 3 | S.at(i) |
Lấy kí tự tại vị trí i của xâu S (chỉ số bắt đầu từ 0). Kiểu trả về: char. Ví dụ: string S="Hello"; cout << S.at(1); → e
|
| 4 | S[i] |
Truy cập trực tiếp kí tự thứ i của xâu. Kiểu trả về: char. Ví dụ: cout << S[0]; → H
|
| 5 | S.substr(pos,len) |
Lấy xâu con bắt đầu từ vị trí pos gồm len kí tự. Kiểu trả về: string. Ví dụ: string S="Hello"; cout << S.substr(1,3); → ell
|
| 6 | S.find(x) |
Tìm vị trí xuất hiện đầu tiên của x trong xâu. Kiểu trả về: size_t (vị trí tìm được hoặc string::npos). Ví dụ: S.find("lo") → 3
|
| 7 | S.rfind(x) |
Tìm vị trí xuất hiện cuối cùng của x trong xâu. Kiểu trả về: size_t.
|
| 8 | S.append(x) |
Nối thêm xâu x vào cuối xâu S. Kiểu trả về: string&. Ví dụ: S.append("abc");
|
| 9 | S.push_back(c) |
Thêm kí tự c vào cuối xâu. Kiểu trả về: void. Ví dụ: S.push_back('!');
|
| 10 | S.pop_back() |
Xóa kí tự cuối cùng của xâu. Kiểu trả về: void.
|
| 11 | S.insert(pos,x) |
Chèn xâu x vào vị trí pos. Kiểu trả về: string&.
|
| 12 | S.erase(pos,len) |
Xóa len kí tự bắt đầu từ pos. Kiểu trả về: string&.
|
| 13 | S.replace(pos,len,x) |
Thay thế len kí tự bằng xâu x. Kiểu trả về: string&.
|
| 14 | S.clear() |
Xóa toàn bộ nội dung xâu. Kiểu trả về: void.
|
| 15 | S.empty() |
Kiểm tra xâu có rỗng hay không. Kiểu trả về: bool. Ví dụ: if(S.empty())
|
| 16 | S.compare(x) |
So sánh hai xâu. Kiểu trả về: int. =0 nếu hai xâu bằng nhau, <0 nếu S<x, >0 nếu S>x. |
| 17 | stoi(S) |
Chuyển xâu sang số nguyên. Kiểu trả về: int. Ví dụ: stoi("123") → 123
|
| 18 | to_string(x) |
Chuyển số sang xâu. Kiểu trả về: string. Ví dụ: to_string(25) → "25"
|
| TT | Tên hàm | Ghi chú |
|---|---|---|
| 1 | isdigit(c) |
Kiểm tra c có phải chữ số hay không (0–9). Kiểu trả về: bool (true / false).Ví dụ: isdigit('5') → true
|
| 2 | isalpha(c) |
Kiểm tra c có phải chữ cái (A–Z, a–z). Kiểu trả về: bool.Ví dụ: isalpha('A')
|
| 3 | isalnum(c) |
Kiểm tra c là chữ hoặc số. Kiểu trả về: bool.
|
| 4 | islower(c) |
Kiểm tra c là chữ thường (a–z). Kiểu trả về: bool.
|
| 5 | isupper(c) |
Kiểm tra c là chữ hoa (A–Z). Kiểu trả về: bool.
|
| 6 | toupper(c) |
Chuyển kí tự c sang chữ hoa. Kiểu trả về: char.Ví dụ: toupper('a') → A
|
| 7 | tolower(c) |
Chuyển kí tự c sang chữ thường. Kiểu trả về: char.Ví dụ: tolower('A') → a
|
| 8 | isspace(c) |
Kiểm tra kí tự khoảng trắng. Bao gồm: space, tab, newline. Kiểu trả về: bool.
|
| 9 | isxdigit(c) |
Kiểm tra kí tự thuộc hệ thập lục phân (0–9, A–F, a–f). Kiểu trả về: bool.
|
| 10 | ispunct(c) |
Kiểm tra kí tự dấu câu. Ví dụ: ! , . ; : ? Kiểu trả về: bool.
|
| 11 | isprint(c) |
Kiểm tra kí tự có thể in ra màn hình. Kiểu trả về: bool.
|
| 12 | isgraph(c) |
Kiểm tra kí tự có thể hiển thị (không tính khoảng trắng). Kiểu trả về: bool.
|
| 13 | iscntrl(c) |
Kiểm tra kí tự điều khiển (control character). Ví dụ: newline, tab. Kiểu trả về: bool.
|
| TT | Tên hàm | Ghi chú |
|---|---|---|
| 1 | reverse(begin,end) |
Đảo ngược thứ tự các phần tử trong đoạn [begin,end). Ví dụ đảo toàn bộ xâu: reverse(S.begin(),S.end());
|
| 2 | reverse(S.begin()+a,S.begin()+b) |
Đảo đoạn từ vị trí a → b-1 của xâu. Ví dụ: string S="abcdef";reverse(S.begin()+1,S.begin()+4); → adcbef
|
| 3 | sort(begin,end) |
Sắp xếp các phần tử trong đoạn [begin,end) tăng dần theo ASCII. Ví dụ: sort(S.begin(),S.end());
|
| 4 | sort(S.begin()+a,S.begin()+b) | Sắp xếp các kí tự trong đoạn a → b-1. |
| 5 | sort(S.rbegin(),S.rend()) | Sắp xếp xâu theo thứ tự giảm dần. |
| 6 | count(begin,end,x) |
Đếm số lần xuất hiện của phần tử x trong đoạn. Ví dụ: count(S.begin(),S.end(),'a');
|
| 7 | find(begin,end,x) |
Tìm vị trí xuất hiện đầu tiên của x trong đoạn. Nếu không có trả về end.
|
| 8 | max_element(begin,end) |
Tìm phần tử lớn nhất trong đoạn. Ví dụ: *max_element(S.begin(),S.end())
|
| 9 | min_element(begin,end) | Tìm phần tử nhỏ nhất trong đoạn. |
| 10 | binary_search(begin,end,x) | Kiểm tra x có tồn tại trong đoạn đã sắp xếp. |
| 11 | lower_bound(begin,end,x) | Tìm vị trí đầu tiên có giá trị ≥ x trong đoạn đã sắp xếp. |
| 12 | upper_bound(begin,end,x) | Tìm vị trí đầu tiên có giá trị > x. |
| 13 | next_permutation(begin,end) |
Sinh hoán vị kế tiếp theo thứ tự từ điển. Ví dụ: S="abc" → acb
|
| 14 | prev_permutation(begin,end) | Sinh hoán vị trước đó. |
| 15 | unique(begin,end) |
Loại bỏ các phần tử trùng liên tiếp. Thường dùng kèm: S.erase(unique(...),S.end());
|
| 16 | rotate(begin,middle,end) |
Dịch vòng đoạn. Ví dụ: rotate(S.begin(),S.begin()+2,S.end());
|
| 17 | fill(begin,end,x) | Gán toàn bộ phần tử trong đoạn bằng giá trị x. |
| 18 | transform(begin,end,dest,func) |
Biến đổi các phần tử theo hàm func. Ví dụ đổi chữ hoa: transform(S.begin(),S.end(),S.begin(),::toupper);
|
| 19 | all_of(begin,end,func) | Kiểm tra tất cả phần tử thỏa điều kiện. |
| 20 | any_of(begin,end,func) | Kiểm tra có ít nhất một phần tử thỏa điều kiện. |
| 21 | none_of(begin,end,func) | Kiểm tra không có phần tử nào thỏa điều kiện. |
Mục tiêu:
Kiến thức:
Khai báo kí tự char, xâu string:
char ch;
char ch1 = 'a';
char ch2 = 'A';
char ch3 = 65; // kí tự A
string ten_xau;
string ten_xau = "";
string ten_xau = "xau ki tu";
Bảng mã ASCII số và chữ cái cần ghi nhớ (hệ thập phân):
Ví dụ: Chuyển chữ số 2 sang con số 2 dùng: '2' - '0'
Ví dụ 1: In ra mã ASCII của số 0 đến 9.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
char ch;
for(ch = '0'; ch <= '9'; ch++)
{
cout << (int)ch << " ";
}
return 0;
}
Ví dụ 2: In ra mã ASCII của kí tự 'A' đến 'Z'.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
char ch;
for(ch = 'A'; ch <= 'Z'; ch++)
{
cout << (int)ch << " ";
}
return 0;
}
Ví dụ 3: In ra mã ASCII của kí tự 'a' đến 'z'.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
char ch;
for(ch = 'a'; ch <= 'z'; ch++)
{
cout << (int)ch << " ";
}
return 0;
}
Ví dụ 4: In ra kí tự từ mã ASCII.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int ch;
for(ch = 65; ch <= 90; ch++)
{
cout << (char)ch << " ";
}
return 0;
}
getline()#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S1, S2;
getline(cin, S1);
getline(cin, S2);
cout << S1 << "\n";
cout << S2;
return 0;
}
getline()#include <bits/stdc++.h>using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);freopen("XAU.INP","r",stdin); freopen("XAU.OUT","w",stdout); string hoten, diachi; getline(cin, hoten); getline(cin, diachi); cout << hoten << "\n"; cout << diachi; return 0;
}
Khi nhập nhiều dòng có thể dùng hàm cin.ignore(1) hoặc cin.ingore() để loại bỏ đi 1 ký tự trong luồng cin, khi đó ký tự enter sẽ bị loại bỏ và hàm getline() sẽ đợi bạn nhập nội dung sau đó ấn enter. Ngoài ra bạn cũng có thể sử dụng hàm getchar() vì hàm này sẽ đọc 1 ký tự trong luồng cin và đọc được ký tự enter thừa.
- Độ dài xâu dùng hàm (phương thức): length() hoặc size().
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Xin chao tat ca cac ban ";
int do_dai_xau = S.length();
cout << "Do dai xau S = " << do_dai_xau << "\n";
int do_dai_xau2 = S.size();
cout << "Do dai xau S = " << do_dai_xau2 << "\n";
return 0;
}
- Xâu rỗng có độ dài bằng 0. Để kiểm tra xâu rỗng dùng phương thức empty(). Hàm trả về true khi string rỗng, ngược lại trả về false.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "";
cout << "Xau S co rong hay khong?: " << S.empty() << "\n";
return 0;
}
Chuỗi con (Substring)
xaucon = xaugoc.substr(vị_trí_bắt_đầu, độ_dài);
Vị trí bắt đầu ≥ 0
Độ dài xâu con ≤ độ dài xâu gốc
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string xaugoc = "abcdef";
string xaucon;
xaucon = xaugoc.substr(0,1);
cout << xaucon << "\n";
xaucon = xaugoc.substr(2,5);
cout << xaucon << "\n";
xaucon = xaugoc.substr(0,3);
cout << xaucon << "\n";
return 0;
}
- Xóa sạch xâu (làm rỗng xâu): clear()
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Quyn";
cout << "Xau S co rong hay khong?: " << S.empty() << "\n";
S.clear();
cout << "Xau S co rong hay khong?: " << S.empty() << "\n";
return 0;
}
- Truy cập phần tử trong string:
S[i] hoặc S.at(i) với điều kiện
0 ≤ i < S.length()
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Vang Van Quyn";
int len = S.length();
for(int i = 0; i < len; i++)
cout << "Ky tu: " << S[i] << "\n";
for(int i = 0; i < len; i++)
cout << "Ky tu: " << S.at(i) << "\n";
return 0;
}
- Xóa kí tự cuối cùng nếu xâu không rỗng: pop_back()
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Vang Van Quyn";
cout << "Do dai S " << S.length() << "\n";
S.pop_back();
cout << "Do dai S " << S.length() << "\n";
return 0;
}
- Xóa một kí tự ở vị trí chỉ định:
S.erase(S.begin() + vị_trí);
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Vang Van Quyn";
cout << S << "\n";
S.erase(S.begin()+2);
cout << S << "\n";
return 0;
}
Input: Vang Van Quyn
Output: Vag Van Quyn
- Xóa các kí tự trong phạm vi
S.erase(S.begin()+start, S.begin()+end);
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Vang Van Quyn";
cout << S << "\n";
S.erase(S.begin()+0, S.begin()+3);
cout << S << "\n";
return 0;
}
Input: Vang Van Quyn
Output: g Van Quyn
- Xóa theo dạng chỉ số
S.erase(index,length)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Vang Van Quyn";
cout << S << "\n";
S.erase(4,7);
cout << S << "\n";
return 0;
}
Input: Vang Van Quyn
Output: Vang Van Quyn
- Xóa từ vị trí chỉ định đến hết xâu
S.erase(index)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Vang Van Quyn";
cout << S << "\n";
S.erase(4);
cout << S << "\n";
return 0;
}
Input: Vang Van Quyn
Output: Vang
- Nối xâu: push_back(), append(), phép +
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Quy";
S.push_back('n');
cout << "S la: " << S << "\n";
S.clear();
S.append("Vang ");
S.append("Van ");
S.append("Quyn");
cout << "S la: " << S << "\n";
S.clear();
S = S + "Vang ";
S = S + "Van ";
S = S + "Quyn";
cout << "S la: " << S << "\n";
return 0;
}
- Chèn một xâu vào vị trí bất kì: insert()
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Quyn";
S.insert(1,"C++");
cout << "S la: " << S << "\n";
return 0;
}
- Thay thế một phần của xâu: replace()
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Hoc lap trinh Pascal";
S.replace(14,6,"C++");
cout << "S la: " << S << "\n";
return 0;
}
- Tìm vị trí xuất hiện của xâu con: find()
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "Hoc lap trinh Pascal";
string S1 = "Pascal";
int vt = S.find(S1);
cout << "Vi tri: " << vt << "\n";
return 0;
}
- So sánh hai xâu: S1.compare(S2)
S1.compare(S2) == 0 nếu S1 = S2
S1.compare(S2) > 0 nếu S1 > S2
S1.compare(S2) < 0 nếu S1 < S2
- Chuyển đổi số sang xâu và ngược lại
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int songuyen = 45786;
string ssonguyen = to_string(songuyen);
int so = stoi(ssonguyen);
long so1 = stol(ssonguyen);
float so2 = stof(ssonguyen);
double so3 = stod(ssonguyen);
cout << songuyen << "\n";
cout << so << "\n";
cout << so1 << "\n";
cout << so2 << "\n";
cout << so3 << "\n";
return 0;
}
- Chuyển đổi chữ số sang con số và ngược lại
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
char ch = '4';
int so = ch - '0';
cout << so << "\n";
so = ch - 48;
cout << so << "\n";
cout << so + 5;
return 0;
}
| TT | Tên hàm | Ghi chú |
|---|---|---|
| 1 | to_string(x) |
Chuyển số sang xâu. Kiểu trả về: string. Ví dụ: int x = 123;string s = to_string(x);Kết quả: "123" |
| 2 | stoi(S) |
Chuyển xâu sang số nguyên. Kiểu trả về: int. Ví dụ: string S="456";int x = stoi(S); → 456
|
| 3 | stol(S) |
Chuyển xâu sang số nguyên kiểu long. Ví dụ: string S="123456";long x = stol(S);
|
| 4 | stoll(S) |
Chuyển xâu sang số nguyên kiểu long long. Ví dụ: string S="987654321";long long x = stoll(S);
|
| 5 | stof(S) |
Chuyển xâu sang số thực kiểu float. Ví dụ: string S="3.14";float x = stof(S);
|
| 6 | stod(S) |
Chuyển xâu sang số thực kiểu double. Ví dụ: string S="2.718";double x = stod(S);
|
| 7 | stold(S) |
Chuyển xâu sang số thực kiểu long double.
|
| 8 | char → int |
Chuyển kí tự chữ số sang số nguyên. Ví dụ: char c='7';int x = c-'0'; → 7
|
| 9 | int → char |
Chuyển số sang kí tự chữ số. Ví dụ: int x=5;char c = x+'0'; → '5'
|
| 10 | atoi(S) |
Chuyển chuỗi C-style sang số nguyên. Thư viện: <cstdlib>. Ví dụ: char s[]="123";int x = atoi(s);
|
| 11 | atof(S) |
Chuyển chuỗi C-style sang số thực. Ví dụ: char s[]="3.14";double x = atof(s);
|
| 12 | stringstream |
Chuyển đổi giữa xâu và số bằng luồng dữ liệu. Thư viện: <sstream>. Ví dụ: stringstream ss("123");int x; ss >> x;
|
- Hàm isdigit kiểm tra xem một kí tự có phải là chữ số hay không.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "abh45gghu6f8j7k9lpn";
int i = 0, len = S.length();
for(i = 0; i < len; i++)
{
cout << isdigit(S.at(i));
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int so = 4;
char ch = so + '0';
cout << ch << "\n";
ch = so + 48;
cout << ch << "\n";
cout << ch + 5 << "\n";
cout << (ch + 5) - '0';
return 0;
}
- Bài tập áp dụng
Cho xâu:
S = "abh45gghu6f82j7k9lpn"
Chuyển các kí tự là chữ số sang kiểu số và tính tổng các số đó
(tức là tính: 4 + 5 + 6 + 8 + 2 + 7 + 9)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "abh45gghu6f82j7k9lpn";
int i = 0, len = S.length();
int T = 0;
for(i = 0; i < len; i++)
{
if(isdigit(S.at(i)))
{
int so = (int)(S.at(i) - '0');
cout << so << "\n";
T = T + so;
}
}
cout << "Tong = " << T;
return 0;
}
- Bài tập vận dụng
Cho xâu:
S = "abh45gghu6f82j7k9lpn"
Tính tổng các số là các chữ số liên tiếp nhau trong xâu S được chuyển sang kiểu số
(tức là tính: 45 + 6 + 82 + 7 + 9)
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = "abh45gghu6f82j7k9lpn";
int i = 0, len = S.length();
int T = 0;
int so = 0;
for(i = 0; i < len; i++)
{
if(isdigit(S.at(i)))
{
so = so * 10 + S.at(i) - '0';
}
else
{
if(so != 0)
{
cout << so << "\n";
T = T + so;
}
so = 0;
}
}
cout << "Tong = " << T;
return 0;
}
- Chuyển chữ HOA sang chữ thường: tolower(kí tự).
- Kiểm tra xem có phải chữ HOA hay không: isupper(kí tự).
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string str = "VAnG vAN qUyN";
int len = str.length();
int i = 0, c;
for (i = 0; i < len; i++)
{
c = str[i];
if (isupper(c))
{
str[i] = tolower(c);
}
}
cout << str;
return 0;
}
- Chuyển chữ thường sang chữ HOA: toupper(kí tự).
- Kiểm tra xem có phải chữ thường hay không: islower(kí tự).
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string str = "VAnG vAN qUyN";
int len = str.length();
int i = 0, c;
for (i = 0; i < len; i++)
{
c = str[i];
if (islower(c))
{
str[i] = toupper(c);
}
}
cout << str;
return 0;
}
* Xóa kí tự dấu cách thừa (O(n)) gồm:
- Xóa dấu cách ở đầu xâu.
- Xóa dấu cách ở cuối xâu.
- Xóa dấu cách thừa giữa các từ (nhiều dấu cách → 1 dấu cách).
Ý tưởng: Duyệt xâu một lần, xây dựng xâu mới:
- Bỏ qua dấu cách ở đầu.
- Nếu gặp kí tự khác khoảng trắng → thêm vào.
- Nếu gặp dấu cách → chỉ thêm khi trước đó không phải dấu cách.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = " chao cac ban ";
string res = "";
int i = 0, n = S.length();
// Bỏ dấu cách đầu
while(i < n && S[i] == ' ') i++;
bool space = false; // đánh dấu đã có dấu cách hay chưa
for(; i < n; i++)
{
if(S[i] != ' ')
{
res += S[i];
space = false;
}
else
{
if(!space)
{
res += ' ';
space = true;
}
}
}
// Xóa dấu cách cuối nếu có
if(!res.empty() && res.back() == ' ')
res.pop_back();
cout << res;
return 0;
}
Kết quả:
Input: " chao cac ban "
Output: "chao cac ban"
Độ phức tạp: O(n)
* Chuẩn hóa xâu (viết hoa chữ cái đầu mỗi từ)
Bước 1: Chuẩn hóa xâu (xóa dấu cách thừa).
Bước 2: Chuyển toàn bộ xâu sang chữ thường.
Bước 3: Viết hoa chữ cái đầu mỗi từ.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
string S = " vAnG VAn quYN ";
string res = "";
int i = 0, n = S.length();
// Bước 1: Xóa dấu cách thừa (O(n))
while(i < n && S[i] == ' ') i++;
bool space = false;
for(; i < n; i++)
{
if(S[i] != ' ')
{
res += S[i];
space = false;
}
else
{
if(!space)
{
res += ' ';
space = true;
}
}
}
if(!res.empty() && res.back() == ' ')
res.pop_back();
// Bước 2: Chuyển toàn bộ sang chữ thường
for(i = 0; i < res.length(); i++)
{
res[i] = tolower(res[i]);
}
// Bước 3: Viết hoa chữ cái đầu mỗi từ
if(!res.empty())
res[0] = toupper(res[0]);
for(i = 1; i < res.length(); i++)
{
if(res[i-1] == ' ')
{
res[i] = toupper(res[i]);
}
}
cout << res;
return 0;
}
Kết quả:
Input: " vAnG VAn quYN "
Output: "Vang Van Quyn"
Độ phức tạp: O(n)
sort()* Sắp xếp xâu và ghép xâu để tạo số lớn nhất
- Dùng hàm sort() để sắp xếp xâu.
- Có thể sắp xếp tăng dần hoặc giảm dần.
- Ghép hai xâu rồi tiếp tục sắp xếp để tạo số lớn nhất.
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string s1 = "5450";
string s2 = "708";
sort(s1.begin(), s1.end());
cout << "Sap xep tang dan: " << s1 << "\n";
sort(s1.begin(), s1.end(), greater<char>());
cout << "Sap xep giam dan: " << s1 << "\n";
sort(s2.begin(), s2.end(), greater<char>());
cout << "Sap xep giam dan: " << s2 << "\n";
string s3 = s1 + s2;
cout << "Noi s2 vao s1 thanh s3: " << s3 << "\n";
sort(s3.begin(), s3.end(), greater<char>());
cout << "Sap xep s3 giam dan de tao duoc so lon nhat: " << s3 << "\n";
return 0;
}
Kết quả:
s1 = "5450" → 5540
s2 = "708" → 870
s3 = "5540870" → 8755400
Ghi nhớ:
- sort(S.begin(), S.end()) → tăng dần.
- sort(S.begin(), S.end(), greater<char>()) → giảm dần.
- Sắp xếp giảm dần giúp tạo số lớn nhất từ các chữ số.