PAT 乙级 1078 / 1084
题目
题解
1078和1084这两道题放在一块写,主要是因为这两道题的解法和做题思路非常相似;之前我做这一类题没有一个固定的套路,想到哪写到哪,在某种程度上就导致代码冗余度高,准确率不够等种种问题;通过这两道题我希望我能够掌握这一类题目的解决方式,并最好可以总结成一个模板,形成一个固定的套路;
这两道题目的本质实际上就是对一个数串或字符串进行连续重复元素的统计,再以某种方式把统计结果输出;因此其中最需要解决的问题就是如何统计重复元素并做记录;
这两道题的解题方式总结如下:
1. 遍历串中的元素,并事先根据题意定义相关统计变量;
2. 在第一层遍历循环中嵌套一层 while 循环,循环条件是当前访问元素是否等于下一个将要访问的元素、相关题设条件;
3. 若等于,则进入循环,统计变量根据题设条件改变,第一层的循环变量自增1;
4. 若不等于,则根据题设条件进行其他操作;
还有一个问题需要再提一下,解题思路一定要灵活,不要囿于格式化的思维模式,比方说题目对一个字符串进行操作,那么我就会把所有的输出都化为字符类型再输出,这就是典型的僵化思维,如果题目没有规定输出格式,那么在统计结束后直接输出整数或浮点类型的结果就可以在很大程度上简化代码;这只是一个例子,主要目的是为了提醒自己思维不要那么死板,在做题过程中一定要灵活。
代码
1078
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 void fun_C () { 6 string str; 7 getline(cin, str); 8 for (int i = 0; i < str.size(); i++) { 9 int cnt = 1; 10 while (str[i] == str[i + 1]) { 11 cnt++; 12 i++; 13 } 14 if (cnt != 1) 15 cout << cnt; 16 cout << str[i]; 17 } 18 cout << endl; 19 } 20 21 void fun_D () { 22 string str; 23 getline(cin, str); 24 for (int i = 0; i < str.size(); i++) { 25 int cnt = 0; 26 while (str[i] >= '0' && str[i] <= '9') { 27 cnt = cnt * 10 + int(str[i]) - 48; 28 i++; 29 } 30 for (int j = 0; j < cnt; j++) 31 cout << str[i]; 32 if (cnt == 0) 33 cout << str[i]; 34 } 35 cout << endl; 36 } 37 38 int main() { 39 char c = 0; 40 cin >> c; 41 cin.ignore(); 42 if (c == 'C') 43 fun_C(); 44 else 45 fun_D(); 46 47 return 0; 48 }
1084
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 int main() { 6 vector<int> vec, tmp; 7 int d = 0, n = 0; 8 int cnt = 1; 9 cin >> d >> n; 10 vec.push_back(d); 11 for (int A = 1; A < n; A++) { 12 for (int i = 0; i < vec.size(); i++) { 13 while (vec[i] == vec[i + 1] && i < vec.size() - 1) { 14 cnt++; 15 i++; 16 } 17 tmp.push_back(vec[i]); 18 tmp.push_back(cnt); 19 cnt = 1; 20 } 21 vec = tmp; 22 tmp.clear(); 23 } 24 for (int i = 0; i < vec.size(); i++) 25 cout << vec[i]; 26 cout << endl; 27 28 return 0; 29 }