PAT刷题(一、字符串处理)

前言

大学期间项目做了不少,而在算法题方面还是个小白。借着考研机会,把PAT甲级刷一遍,同时记录一下心得。主要参考的是柳神的题解,略过了不会考或考的可能性很小的题。如果做法和题解不大一样,就贴一下自己的代码。

1001 A+B Format (20)

思路

挺简单的~(毕竟第一题)熟悉了一下to_string()的用法。

链接

原题链接
题解

1005 Spell It Right (20)

思路

自己的做法复杂了~通过取余和整除得到每一位数字也是可以做的,但用to_string()会更快。

链接

原题链接
题解

1035 Password (20)

思路

STL真香~( ̄▽ ̄)/还是挺简单的一道题。

链接

原题链接
题解

1061 Dating (20)

思路

题目不难,理解题意最重要~注意隐含条件。

小技巧

  1. ctype库中,有isalpha()和isdigit()快速判断是否为数字和小写字母。

踩过的坑

  1. 计算日期时候,隐含了相同大写字母是在A~G范围的条件。

链接

原题链接
题解

1073 Scientific Notation (20)

思路

先保存E后指数,然后依据指数的正负、小数点的位置分成四种情况讨论。看起来比较复杂,但思路很简单,细心一点就不会出错。

链接

原题链接
题解

1077 Kuchiguse (20)

思路

对每个字符串倒置之后再进行比较,熟悉了一下reverse()和getline()的使用。

踩过的坑

  1. 输入的字符串可能包含空格,因此不能用cin输入,而应该使用getline(),并且注意使用getchar()接收回车符。

链接

原题链接
题解

1082 Read Number in Chinese (25)

思路

这道字符串处理题目做了好久,主要是输出零的格式没想明白,太痛苦了。。。设置了两个变量,zero决定每四位是否输出“亿”“万”,keepzero代表是否有累积的0。我特意处理了一下字符串头部的多余0,在这题里面应该是多余的。

踩过的坑

  1. 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()方法确定小数点位置,判断是否包含三位及以上的小数。

踩过的坑

  1. 一开始没有用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的使用后细心一点就能做出来。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值