前言
大学期间项目做了不少,而在算法题方面还是个小白。借着考研机会,把PAT甲级刷一遍,同时记录一下心得。主要参考的是柳神的题解,略过了不会考或考的可能性很小的题。如果做法和题解不大一样,就贴一下自己的代码。
1001 A+B Format (20)
思路
挺简单的~(毕竟第一题)熟悉了一下to_string()的用法。
链接
1005 Spell It Right (20)
思路
自己的做法复杂了~通过取余和整除得到每一位数字也是可以做的,但用to_string()会更快。
链接
1035 Password (20)
思路
STL真香~( ̄▽ ̄)/还是挺简单的一道题。
链接
1061 Dating (20)
思路
题目不难,理解题意最重要~注意隐含条件。
小技巧
- ctype库中,有isalpha()和isdigit()快速判断是否为数字和小写字母。
踩过的坑
- 计算日期时候,隐含了相同大写字母是在A~G范围的条件。
链接
1073 Scientific Notation (20)
思路
先保存E后指数,然后依据指数的正负、小数点的位置分成四种情况讨论。看起来比较复杂,但思路很简单,细心一点就不会出错。
链接
1077 Kuchiguse (20)
思路
对每个字符串倒置之后再进行比较,熟悉了一下reverse()和getline()的使用。
踩过的坑
- 输入的字符串可能包含空格,因此不能用cin输入,而应该使用getline(),并且注意使用getchar()接收回车符。
链接
1082 Read Number in Chinese (25)
思路
这道字符串处理题目做了好久,主要是输出零的格式没想明白,太痛苦了。。。设置了两个变量,zero决定每四位是否输出“亿”“万”,keepzero代表是否有累积的0。我特意处理了一下字符串头部的多余0,在这题里面应该是多余的。
踩过的坑
- 3号测试点的输入是0,故需要额外做一次判断。
代码
#include<bits/stdc++.h>
using namespace std;
string str[10]={"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
int main()
{
string s;
int i, temp;
bool zero = true, keepzero = false;
vector<string> res;
cin >> s;
if(s[0]=='-'){
res.push_back("Fu");
s.erase(s.begin());
}
while(s[0]=='0'&&s.size()>1) s.erase(s.begin());//去除多余0
for(i=0; i<s.size(); i++){
if(i%4==s.size()%4) zero = true;
temp = stoi(s.substr(i,1));
if(temp==0){
keepzero = true;
}
else{
if(keepzero) res.push_back("ling");
zero = false;
keepzero = false;
res.push_back(str[temp]);
if((s.size()-i)%4==0) res.push_back("Qian");
else if((s.size()-i)%4==3) res.push_back("Bai");
else if((s.size()-i)%4==2) res.push_back("Shi");
}
if(s.size()-i==9&&!zero) res.push_back("Yi");
if(s.size()-i==5&&!zero) res.push_back("Wan");
}
if(res.size()==0) res.push_back("ling");//额外判断整个串是否为0
for(i=0; i<res.size(); i++){
cout << res[i];
if(i!=res.size()-1) cout << " ";
}
return 0;
}
链接
1108 Finding Average (20)
思路
使用isalpha()判断是否包含字母,对确定是数字的使用stod()转化,并用string.find()方法确定小数点位置,判断是否包含三位及以上的小数。
踩过的坑
- 一开始没有用string.find()方法确定小数点位置,而是选择stod(s)*100-(int)(stod(s)*100)是否为0判断小数位数,然而两位小数0.12代入该式,得到的结果是1却不是0,不是很明白为什么会这样。
链接
1140 Look-and-say Sequence (20)
思路
读题读了好久才懂什么意思。。读取前一个串,比如“D11231”,有1个D,2个1,1个2,1个3,1个1,则下一个串为“D112211311”。注意,不是先统计每个位置的数再生成下一个字符串,而是统计连续相同数字/D的个数。
链接
1152 Google Recruitment (20)
思路
使用stoi()转化子串,按序判断是否为素数即可。
链接
字符串处理的题型整体不难,就是小细节特别多,熟悉string的使用后细心一点就能做出来。