【PAT刷题经验】持续更新中...

啊,PAT3月13日的考试马上就要开始啦,本小白马上要去现场当炮灰了~  但是考试还是要总结一下刷题的经验~

去考乙级应该能考个90分左右,但是甲级嘛...就满打满算复习了一个月,而且刷的题也大多数是乙级的题,数据结构还真没怎么复习... 我觉得能考60分就是奇迹~(自zi我bao安zi慰qi)

2021/3/12 更新一下,如果是照着2020秋季的考,我极有可能考零蛋~  啊!

2021/3/13 更新:虽然并没有考零蛋 ヽ(゚∀゚*)ノ

  • 啊,到了考场用DevC++的时候,在编译选项中,勾选上-std=c++11   很重要!!!
  • (2020/3/18更新)考场上的PAT答题环境虽然和平时训练时几乎是1:1的,但是不像平时有代码提示的~
  • 使用 #include<bits/stdc++.h> 这个万能头文件很省事~  但是使用万能头文件编译时间可能略长。。。可能会造成程序超时!
  • 可以使用C语言中的 scanf 和 printf 来进行输入输出,因为使用 cin 和 cout 存在一个缓冲区的刷新,时间较慢,可能会造成程序超时。
  • map使用方法:

  • set使用方法:

  • 判断一个数是否为素数(2是素数!!!1不是素数)第一个素数是2
bool isprime(int a) {
    for (int i = 2; i * i <= a; i++)
        if (a % i == 0) return false;
    return true;
}
  • 当使用  while(cin >> s)  语句时,停止输入是Ctrl+Z+回车
  • C++ STL 栈 stack 的用法
    #include <iostream>
    #include <stack>
    using namespace std;
    int main() {
        stack<int> s; // 定义⼀个空栈s
        for (int i = 0; i < 6; i++) {
            s.push(i); // 将元素i压⼊栈s中
        }
        cout << s.top() << endl; // 访问s的栈顶元素
        cout << s.size() << endl; // 输出s的元素个数
        s.pop(); // 移除栈顶元素
        return 0;
    }
  •  C++ STL 队列 queue 的使⽤
    #include <iostream>
    #include <queue>
    using namespace std;
    int main() {
        queue<int> q; // 定义⼀个空队列q
        for (int i = 0; i < 6; i++) {
            q.push(i); // 将i的值依次压⼊队列q中
        }
        cout << q.front() << " " << q.back() << endl; // 访问队列的队⾸元素和队尾元素
        cout << q.size() << endl; // 输出队列的元素个数
        q.pop(); // 移除队列的队⾸元素
        return 0;
    }

    注意,如果是个结构体队列,eg. queue<node> q; 入队时,可以 q.push({a, b}); 在这一点上,栈也是一样的。

  • #include <cmath>使用 C++(g++) 提交会出错? 额,我也不知道这是为什么。之前刷题遇到的 ---> 1007 素数对猜想

  • 千万注意题干对于空格、换行输出的要求,否则提交的代码会报  “格式错误

  • long long 用起来!!!详情 

int: -2^31~2^31-1(十进制-2147483648~2147483647)  -> 10^9以下使用无误

long long: -2^63~2^63-1  十进制

  • memset(e,-1,sizeof(e)); 把矩阵e的所有元素初始化为-1  #include<memory.h>
  • char->int :a2=a1-'0' ;   int->char: a2=a1+'0'.
  • 判断char类型的变量是不是数字isdigit(变量名);判断char类型的变量是不是字母isalpha(变量名)
  • scanf(" %c",&grade);   // 注意%c前面有一个空格 
  • s.substr(i,k):截取子字符串 从下标i开始截取k个字符.   s.substr(i): 截取子字符串 从下标i开始截取到s的最后
  • 输入一整行的string类型(eg.带空格的字符串),要使用getline(cin,s);
  • 如果cin或scanf()后有读入一整行的操作例如getline(cin,s),需要在cin、scanf()后加一个getchar()
  • printf("%s", xxx.c_str());   //使用printf打印字符串变量要小心,在变量名后加  .c_str()
  • string 字符串的每一个元素是字符char类型,把一个元素转成整数是 s[i]-'0' 而不是#include<cctype>的 stoi(string s) 函数!!! 
  • 对string 字符串的某个元素与一个字符进行比较的时候是是 s[i] == 'c' ,是单引号而不是双引号。
  • 用个flag=0/1做判断比较简洁哦
  • 一个vector赋值给另一个vector:给v2复制一份v1的数据------> v2=v1

  • map<int,vector<int>> xx ; 可以用

  • vector<int> a(n+1,1);   创建一个长为n+1的int型数组,并将数组中每一个位置的值都一次性赋值为1.

  • reverse(s.begin(),s.end()); 反转字符串

  • unordered_map比map快

  • 求两个数的最大公因数最小公倍数

    int gcd(int a,int b){    //求a、b的最大公因数
    	return b == 0 ? a : gcd(b, a % b);
    }
    int gbs(int a,int b){    //求a、b的最小公倍数
        int gys = gcd(a, b); //a,b的最大公因数
        return (a > b) ? a*gys/b : b*gys/a;
    }

    注意求最大公因数的辗转相余~

  • 判断两个数是否异号,最好不要用  (a*b<0)?  来判断,因为a*b的值本身可能超过了题干要求的范围

  • s.find(xxx) == string::npos 如果在字符串 s 中找xxx,未找到,返回的是 string:npos!!!很实用

  • 加权求和的意思是每一个元素与权值做乘法后把结果相加

  • transform(s.begin(), s.end(), s.begin(), ::toupper); 字符串转大写

    transform(s.begin(), s.end(), s.begin(), ::tolower);  字符串转小写

  • 注意有些字符串可以直接比较大小(ascii码),比如时间,id号等等~

  • printf的%0Nd格式自动为不足N位的整数在前面补上0 !!!  (非常重要)

  • s.insert( i , N ,'0');    //在s的第 i 个位置插入 N 个 字符'0'

  • 这些已经很多了,but,未完待续...

猜你喜欢

转载自blog.csdn.net/WKX_5/article/details/114678386
今日推荐