王道機試 第四章 字符串 4.2 字符串處理
例題4.1 特殊乘法(清華大學複試上機題)
- 解題思路:
本題數據範圍大於,可用string類型接收較大的整形數。
int類型只能表示到,而long long 可以表示到
所以一般當兩個數據範圍都爲~的數相加時,其和sum要定義爲long long類型,防止數據溢出。
C++代碼如下:
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
string s1, s2;
cin >> s1 >> s2;
int n = s1.size(), m = s2.size();
long long sum = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
sum += (long long)(s1[i] - '0') * (long long)(s2[j] - '0');
}
}
cout << sum << endl;
return 0;
}
例題4.2 密碼翻譯(北京大學複試上機題)
- 解題思路:
本題的關鍵在於如何讀取一行字符(字符串間有空格,不能直接cin >> string)
- C++讀取一行字符(包含空格)的方法
讀取一行字符(字符串間有空格,不能直接cin >> string)
- 使用
getline(cin, str, '結束符')
其中, - str爲std::string類型,可包含空格;
- 結束符代表每行的終止標誌(讀到哪個字符停止),一般默認爲回車符’\n’。如果默認,則可使用
getline(cin, str)
簡化輸入。
本題的C++代碼如下:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
char convert(char ch){
if (ch >= 'a' && ch <= 'y'){
ch = ch + ('b' - 'a');
return (char)(ch);
}
else if (ch == 'z') return 'a';
else if (ch >= 'A' && ch <= 'Y'){
ch = ch + ('B' - 'A');
return (char)(ch);
}
else if (ch == 'Z') return 'A';
else return ch;
}
int main()
{
string s;
while (getline(cin, s)){ // 讀一行(包括空格)
for (int i = 0; i < s.size(); i++){
char ch = convert(s[i]);
cout << ch;
}
cout << endl;
}
return 0;
}
例題4.3 簡單密碼(清華大學複試上機題)
- 解題思路:
- 本題仍然考察getline函數的運用,以及字符串數組映射表的運用
C++代碼如下:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <map>
using namespace std;
char a[] = {'V', 'W', 'X', 'Y', 'Z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U'};
void convert(char ch){
if (ch >= 'A' && ch <= 'Z') cout << a[ch - 'A'];
else cout << ch;
}
int main()
{
string s;
while (getline(cin, s, '\n')){
if (s == "ENDOFINPUT") break;
getline(cin, s, '\n');
for (int i = 0; i < s.size(); i++){
convert(s[i]);
}
cout << endl;
getline(cin, s, '\n');
}
return 0;
}
例題4.4 統計字符(浙江大學複試上機題)
- 解題思路:
- 利用數組a記錄每個字符的個數,a[‘c’]++
C++代碼如下:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
string s, s1, s2;
const int maxn = 1005;
int a[maxn];
int main()
{
int cnt = 0;
while (getline(cin, s1)){
if (s1 == "#") break;
getline(cin, s2);
memset(a, 0, sizeof(a));
for (int i = 0; i < s2.size(); i++){
a[s2[i]]++;
}
for (int i = 0; i < s1.size(); i++){
cout << s1[i] << " " << a[s1[i]] << endl;
}
}
return 0;
}
例題4.5 字母統計(上海交通大學複試上機題)
- 解題思路:
- 利用數組a記錄每個字母的出現次數,a[‘c’]++
C++代碼如下:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int a[maxn];
int main()
{
string s;
while (getline(cin, s)){
memset(a, 0, sizeof(a));
for (int i = 0; i < s.size(); i++){
a[s[i]]++;
}
for (int i = 0; i < 26; i++){
cout << (char)('A' + i) << ":" << a[i + 'A'] << endl;
}
}
return 0;
}
習題4.1 skew數(北京大學複試上機題)
- 解題思路:
- 利用string存儲輸入的int型數字,其中s[i] - '0’代表第i位對應的數字。
- 判斷輸入結束使用
if (s.size() == 1 && s[0] == "0") break;
C++代碼如下:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
string s;
while (cin >> s){
// cout << (int)(s[0] - '0') << endl;
if (s.size() == 1 && s[0] == '0') break;
int sum = 0;
for (int i = 0; i < s.size(); i++){
int k = s.size() - i;
sum = sum + (s[i] - '0') * (int)(pow(2, k) - 1);
}
cout << sum << endl;
}
return 0;
}
習題4.3 首字母大寫(北京大學複試上機題)
- 解題思路:
- 利用toupper()函數將小寫字母轉化爲大寫字母
- 利用getline(cin, s)讀取一行字符串(包含空格,’\t’,’\r’等)
C++代碼如下:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
string s;
while (getline(cin, s)){
for (int i = 0; i < s.size(); i++){
if (i == 0) s[i] = toupper(s[i]);
else{
if (s[i - 1] == '\n' || s[i - 1] == ' ' || s[i - 1] == '\t' || s[i - 1] == '\r'){
s[i] = toupper(s[i]);
}
}
}
cout << s << endl;
}
return 0;
}
習題4.5 後綴子串排序(上海交通大學複試上機題)
- 解題思路:
- 利用substr(pos, len)函數提取字符串。即:從第pos(從0開始計數)個字符開始,取長度爲len的字符串,將其返回。
- 對得到的字符串數組利用sort排序即可
C++代碼如下:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 10005;
string a[maxn];
int main()
{
string s;
while (getline(cin, s)){
for (int i = 0; i < s.size(); i++){
a[i]=s.substr(i,s.size()-i); // char, len
}
sort(a, a + s.size());
for (int i = 0; i < s.size(); i++){
cout << a[i] << endl;
}
}
return 0;
}