0%

PAT乙级整理

对乙级题目进行了分类整理,仅代表我个人的分类,不是很严谨。如1087可以集合,也可以哈希;1079也有数字计算和进制转换,但核心问题是字符串处理;1094是判断素数,但也有求字符串子串的使用。

此外,乙级以字符串处理为简单题目,其中涉及:求子串、字符串查找、替换等多个考点,借助结构体实现多条件排序,通常难度适中,且需要借助vector等数据结构方能实现。建议按类型刷题。

  • 15分:简单的编程应用,涉及数组、分支、循环、判断等;
  • 20分:比较复杂的编程应用,逻辑复杂,但不涉及数据结构;
  • 25分:涉及简单的数据结构的使用,如vector, map等,不涉及算法,但涉及一些算法库的使用,如algorithm里的sort函数,同样需要合理设计逻辑,如哈希等,不然很容易出错。

整体而言,适合刚入门 OJ 的同学进行练手,就当熟悉常见操作了。

题目整理

类型 题目
数据精度与范围 1011,1034
进制转换 1022,1074
数组应用 1008,1061,1066,1092
素数判断 1007,1013,1094
哈希 1004,1005,1032, 1038,1047,1064,1072,1083
字符串处理 1002,1003,1006,1009,1014,1017,1018,1021,1023,1024,1027,1028,1029,1031,1033,1036,1039,1042,1043,1044,1048,1052,1056,1057,1067,1076,1078,1079,1081,1084,1086, 1091,1093
数学计算 1001,1010,1012,1016,1019,1020,1026,1030,1037,1046,1049,1051,1053,1054,1060,1062,1063,1070,1071,1077,1082,1088,1089
借助结构体的多条件排序 1015,1041,1055,1058,1073,1080,1085,1095
map映射 1059,1065,1069,1090
集合 1087
链表类 1025,1075
排序算法 1035,1045
子串匹配 1040
螺旋矩阵 1050
递归查找 1068

不知为何出错的题目

  • 1030 5分,看不懂题
  • 1044 看不懂题在说什么,仿佛是为了考试而考试,没意思。
  • 1088 18分,一个点没过
  • 1033 19分,一个点没过
  • 1073 14分,两个点没过,猜测算法设计的不好

记录

本人没学过C++,第一次接触,记录的东西可能有点low。1003,1030看不懂题,不知道他在说什么。1005题目的描述实在花了很长时间才看懂。对于这些题目没有做的兴趣。

  1. scanf 代替 cin 可在某种程度上避免超时。
  2. 快速排序前后,主元位置不变,否则常规思路会超时。乙级 1045。
  3. stof, stoi 完成字符串转数字。乙级 1054。
  4. isdigital 传入的变量是char类型。
  5. if if elseif else if else 对代码的执行结果影响不一样。
  6. 二维数组的定义:传入常量不能传入参数。乙级1066。
  7. 输出3位数,高位补0:printf("%03d ", arr[i][j]);
  8. 哈希时要考虑空间大小,int a[99999][99999] 太大了,可以考虑使用 Map。乙级1090。
  9. map键对应的值不止一个时,值可以考虑用 vector 载入。
  10. 数字转字符串:to_string(),字符串逆序(algorithm):reverse(s.begin(), s.end());,乙级1086。
  11. 虽然链表可以考虑顺序结构和链式结构实现,但巧妙的软换会比两者都好。乙级1075。
  12. map配合hash能有效提升程序的效率。乙级1065。
  13. 在不知数据量多少的情况下,读取所有输入 while(cin >> temp)。乙级1009。
  14. 尽量避免批量的命名数组,重复的操作很容易超时,同一种思维也能换一种写法。乙级1015。
  15. 虽然我不知道我的哪里错了,但学习到了abs(j - i) * 1.0 / x != abs(j - i) / x。乙级1088。
  16. cin时注意输入的与声明的数据类型是否有差异。乙级1053。
  17. 尽量不要操作一次删除一次,很容易超时,尽量以下标移动去解决问题。乙级1055。
  18. 乙级1085,差 20ms 超时。if else写法比三元运算符写法耗时。
1
2
3
4
5
6
7
8
9
10
11
12
int cmp(node1 a, node1 b)
{
if (a.score != b.score)
return a.score > b.score;
else
{
if (a.num != b.num)
return a.num < b.num;
else
return a.id < b.id;
}
}

不如return a.score != b.score ? a.score > b.score : a.num != b.num ? a.num < b.num : a.id < b.id;

Bug记录

自己发现了一个 bug,联系了官方,到现在也没个消息,但还是要提醒后来者。(发现时间是2020年2月份,如果它现在改了当我没说)。

在乙级1081题目中,我通过测试代码:虽然代码通过了测试,但仍然有 BUG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>

using namespace std;

int main()
{
int n;
cin >> n;
string temp;
cin.get();
int digit = 0, alpha = 0, flag = 0;
for (int i = 0; i < n; i++)
{
getline(cin , temp);
if (temp.length() < 6)
{
flag = 1;
cout << "Your password is tai duan le." << endl;
}
else
{
for (int j = 0; j < temp.length(); j++)
{
if (isdigit(temp[j]) || isalpha(temp[j]) || temp[j] == '.')
{
if (isdigit(temp[j]))
digit = 1;
if (isalpha(temp[j]))
alpha = 1;
}
else
{
if (flag == 0)
cout << "Your password is tai luan le." << endl;
flag = 1;
// break;
}
}
if (digit == 0 && alpha == 0)
{
flag = 1;
cout << "Your password is tai luan le." << endl;
}
if (digit == 0 && alpha == 1)
{
cout << "Your password needs shu zi." << endl;
flag = 1;
}
if (alpha == 0 && digit == 1)
{
cout << "Your password needs zi mu." << endl;
flag = 1;
}
if (flag == 0 && alpha == 1 && digit == 1)
{
cout << "Your password is wan mei." << endl;
}
}
flag = 0; digit = 0; alpha = 0;
}
return 0;
}

太乱了测试点出错

上面代码虽然通过了它的测试,但有的测试点并没有正确工作。

错误测试点

1
2
3
2
[[[[[[[[[[[[
aaaaaaaaaaaaaa

代码地址

https://github.com/muyuuuu/OnlineJudgeSolutions/tree/master/PAT/%E4%B9%99%E7%BA%A7

感谢上学期间打赏我的朋友们。赛博乞讨:我,秦始皇,打钱。

欢迎订阅我的文章