目录
例题5.4 Zero-complexity Transposition(上交复试上机题)
例题4.4 统计字符(浙大复试上机题)
1、思路
- ASCII码不大,想统计每个字符,直接将其对应的ASCII码下标的元素加1即可
- 先统计第二行中各字符出现的次数,最后输出第一行元素在第二行中出现的次数
2、源代码
#include <iostream>
#include <string>
using namespace std;
int number[128];
int main() {
string str1, str2;
while (getline(cin, str1)) { // 第一行输入
if (str1 == "#")
break;
getline(cin, str2); // 第二行输入
for(int i = 0 ; i < str2.length() ; i++) {
number[i] = 0;
}
for (int i = 0 ; i < str2.length() ; i++) {
number[str2[i]]++; // 统计str2中各字符出现的次数
}
for (int i = 0 ; i < str1.length() ; i++) {
cout << str1[i] << " " << number[str1[i]] << endl;
}
}
}
例题4.5 字母统计(上交复试上机题)
1、思路
- 只要统计大写字母,所有只用大小为26的数组即可
- 注意存储时下标的写法:str[i] - 'A'
- 输出时用printf控制格式
2、源代码
#include <iostream>
#include <string>
using namespace std;
int count[26]; // 统计大写字母出现的次数只需要大小为26的数组
int main() {
string str;
while (cin >> str) {
for (int i = 0 ; i < str.length() ; i++) {
if (str[i] >= 'A' && str[i] <= 'Z') {
count[str[i] - 'A']++;
}
}
for (int i = 0 ; i < 26 ; i++) {
printf("%c:%d\n", 'A' + i, count[i]);
}
}
}
第4章小结:
题目做得很差,后面至少要二刷,习题看了一眼感觉也不会,先跳过刷第五章了。
第5章 数据结构一
5.1 向量
例题5.1 完数与盈数(清华复试上机题)
完数VS盈数_牛客题霸_牛客网 (nowcoder.com)
1、思路
- 完数和盈数分别用两个向量存储
- 写一个函数判断一个数是否等于所有因子的和卡住了,判断因子没有想到用%
- 格式问题:E和G的冒号是英文冒号,而且后面有一个空格。
2、源代码
#include <iostream>
#include <vector>
using namespace std;
// 累加x的所有因子
int sumI(int x) {
int sum = 0;
for (int i = 1 ; i < x ; i++) {
if (x % i == 0) { // i是x的因子
sum += i; // 累加
}
}
return sum;
}
int main() {
vector<int> E; // 存储完数
vector<int> G; // 存储盈数
for (int i = 2 ; i <= 60 ; i++) {
if (i == sumI(i)) {
E.push_back(i);
}
if (i < sumI(i)) {
G.push_back(i);
}
}
cout << "E: "; // 冒号后面还有个空格,好几次都没AC就是因为这里
for (int i = 0 ; i < E.size() ; i++) {
cout << E[i] << " ";
}
cout << endl;
cout << "G: ";
for (int i = 0 ; i < G.size() ; i++) {
cout << G[i] << " ";
}
cout << endl;
}
5.2 队列
例题5.2 约瑟夫问题No.2
例题5.3 猫狗收容所
5.3 栈
例题5.4 Zero-complexity Transposition(上交复试上机题)
例题5.5 括号匹配问题
例题5.6 简单计算器(浙大复试上机题)
1、思路
(
1
)两个栈,符号栈和数字栈。两个哨兵
'#'
和
'$'
,
'#'
压入栈底,
'¥'
接在串后,优先级
'$'
>
'#'
。
(
2
)优先级获得函数:
'#'
=
0
,
'$'
=
1
,
'+'
'-'
=
2
,
'*'
'/'
=
3
。
(
3
)获取数字函数:注意不止一位的数字,第二个参数index要传引用,否则会报内存不足异常
(
4
)加减乘除计算函数
(
5
)遍历字符串,要用getline,直接cin会报段错误
遇到空格则跳过;遇到数字则压入数字栈;
如果遇到的是符号,则比较当前op与操作符栈顶opTop的优先级
1
)若果op>opTop,则将op入栈
2
)如果op<=opTop,则弹出opTop,并弹出数字stack的栈顶和次栈顶,次栈顶为参与运算的在前数字,栈顶数字在后。
计算结果存入数字stack。
(
6
)直到遍历结束,此时操作符stack中只剩
'$'
'#'
,且此时数字stack中只剩一个元素,即为结果。
2、源代码
#include <cctype> // isdigit() ,检查字符是否是十进制数字字符
#include <iostream>
#include <stack>
#include <string>
#include <cstdio>
using namespace std;
// 符号优先级
int Priority(char c) {
if (c == '#') {
return 0;
}
else if (c == '$') {
return 1;
}
else if (c == '+' || c == '-') {
return 2;
}
else {
return 3;
}
}
// 获取数字
double getNum(string str, int& index) { // index要传引用
double num = 0;
while (isdigit(str[index])) {
num = num * 10 + str[index] - '0';
index++;
}
return num;
}
double Calculator(double x, double y, char c) {
double res = 0;
if (c == '+')
res = x + y;
else if (c == '-')
res = x - y;
else if (c == '*')
res = x * y;
else if (c == '/')
res = x / y;
return res;
}
int main() {
string str;
while (getline(cin,str)) {
if (str == "0") {
break;
}
int index = 0;
stack<double> data;
stack<char> op;
str += '$';
op.push('#');
while (index < str.size()) {
if (str[index] == ' ') {
index++;
} else if (isdigit(str[index])) {
data.push(getNum(str, index));
} else {
// 操作符op优先级大于栈顶操作符优先级
if (Priority(str[index]) > Priority(op.top()) ) {
op.push(str[index++]);
} else {
double y = data.top();
data.pop();
double x = data.top();
data.pop();
data.push(Calculator(x, y, op.top()));
op.pop();
}
}
}
printf("%.2f\n", data.top());
}
}
习题5.1 堆栈的使用(吉大复试上机题)
1、思路
简单题,判断类型A/P/O,对应操作就可以
2、源代码
#include <iostream>
#include <stack>
using namespace std;
int main() {
int n;
cin >> n ;
stack<int> s;
for (int i = 0 ; i < n ; i++) {
char c;
cin >> c;
if (c == 'A') {
if (!s.empty()) {
cout << s.top() << endl;
} else
cout << 'E' << endl;
} else if (c == 'P') {
int num;
cin >> num;
s.push(num);
} else if (c == 'O') {
if (!s.empty()) {
s.pop();
}
}
}
}
习题5.2 计算表达式(上交复试上机题)
和例题5.6 基本一致
第五章完成,用的比较多的是栈,主要应用:括号匹配、表达式求值