王道機試 第四章 字符串 4.2 字符串處理

王道機試 第四章 字符串 4.2 字符串處理

例題4.1 特殊乘法(清華大學複試上機題)

  • 解題思路:

本題數據範圍大於10910^9,可用string類型接收較大的整形數。

int類型只能表示到10910^9,而long long 可以表示到101810^{18}

所以一般當兩個數據範圍都爲11~10910^9的數相加時,其和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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章