• PAT基础知识点


    PAT基础知识点

     

    Dev C++支持C++11语法新特性:

    Tool-> Compiler Option-> Add: -std=c++11

    #include <string>

    http://blog.csdn.net/fenxinzi557/article/details/51457829

     

    string赋值 string str = “content”; equals string str (“content”);

     

    string尾部添加 string.append(“”); .append(a,index0,string::npos);//把字符串a的首字母到尾字母加上

     

    string中间插入 sting.insert(index,”content”);

    注:单个字符串(比如数字)的插入

    string str;

    int num = 7;

    str+=(char)(num%7+'0')

     

    string删除 string.erase(index,//number);

     

    string替换 string.replace(index,number,”content”);

     

    string字符个数 string.size() equals string.length(); //常用于循环

    for(int 1=0; i<string.size(); i++){}

     

    string的比较 string.compare(//index,//number,“content”,//index,//number);

     

    string的判空 string.empty();

     

    string的提取

    string[index] equals string.at(index); 单个提取

    string.substr(); 返回全部内容

    string.substr(index,//number);

     

    string的复制 string str2 (str1);

     

    string的分割 string.substr(index,number) ;

     

    string的查找 string.find(“contex”,//index,//number);

    //从index开始找

    //有,返回index,它的类型是string::size_type; 没有,返回string::npos;

    find_first_of 查找包含子串中的任何字符,返回第一个位置

    find_first_not_of 查找不包含子串中的任何字符,返回第一个位置

    find_last_of 查找包含子串中的任何字符,返回最后一个位置

    find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置

    //查找子串出现的所有位置

    string substr = "i";

    position = 0;

    int i = 1;

    while((position = str.find_first_of(substr,position)) != string::npos)

    {

    cout<<"position "<<i++<<position<<endl;

    position++;

    }

     

    字符串反转

    #include <iostream>

    #include <string>

    #include <algorithm>

    using namespace std;

     

    int main()

    {

    string s = "hello";

    reverse(s.begin(),s.end());

    cout<<s<<endl;

    return 0;

    }

     

     

     

     

     

    string的转换(**1002)**

    http://greatverve.cnblogs.com/archive/2012/10/24/cpp-int-string.html

    1. int,float,double等转换为string

    • string = to_string(number)

    1. string转换为int,float

    • 首先要包含头文件#include <algorithm>

    • 调用函数 atoi(string.c_str()); atof(string.c_str())

    int转string

    int a,b;

    cin>>a>>b;

    int c;

    c = a+b;

    char Cchar[10];

    string Cstring = itoa(c,Cchar,10);

     

    string转int

    std::string str = "123";

    int n = atoi(str.c_str());

    OR

    int result = stoi(a) - stoi(b);

     

    string的分割 1009

    C/C++中符号的分割是很困难的,如果不能使用如下方法,那么只能组合使用string.find();和string.substr();的方法了。如下方法在PAT考试中很实用:

    string串的输入 1042

    string串(e.g: I love u)的输入主要要解决两个问题,string串的大小未定,不能用一个string解决(因为含有一个“ ”作为分割)

    • 因为输入时就是以空格为分割,所以可以边输入边存储在vector中,但是要注意去cin.get();吸收空格,回车。当然遵循下面代码的原则就可以啦。

    vector<string> ans;

    while(1){

    string str;

    cin >> str;

    ans.push_back(str);//把每个单词都加入字符串数组

    char c = cin.get(); //用一个字符c来吸收空格

    //作用同getchar();

    if (c == ' '){

    break;

    }

    }

     

    Tips:

    • npos的含义: string::npos的类型是string::size_type,所以,一旦需要把一个索引与npos相比,这个索引值必须是string::size)type类型的,更多的情况下,我们可以直接把函数和npos进行比较

    • 如:if(s.find(“jia”)== string::npos)

    此时string::size_type position; 而不是 int position;

     

    • string[N]是一个char类型

    C/C++中string、char *、char[]的转换

    https://www.cnblogs.com/Pillar/p/4206452.html

     

     

    #include <cmath>

    http://blog.csdn.net/mary19920410/article/details/63696380

     

    int abs 绝对值,返回整型int

    double fabs 绝对值.,返回double

    double pow(double x, double y); 返回x^y 1012

    double log(double x); 返回logeX

    double log10(double x); 返回lgX;

     

    int ceil(double x) 向上取整

    int floor(double y) 向下取整

     

    Notes:

    使用时,直接使用函数即可。例如:计算一个数得平方根

    sqrt(int a) 而不是int a=4; a=a.sqrt();

     

    #include<algorithm>

    http://blog.csdn.net/qq_28479381/article/details/53994972

    http://blog.csdn.net/RRicky_/article/details/76696422

    sort()函数最为常用,但要注意:

    • sort(buffer,buffer+n,//less<data-type>()||greater<data-type>()); buffer为待排序数组的首地址,buffer+n为待排序数组的最后一个数据的地址。

    • less<int>(); 升序

    greater<int>(); 降序

     

    reverse(myvector.begin(),myvector.end()); 翻转一个vector 两个参数,一个首地址,一个尾地址;string的操作类似。

     

    #include<vector>

    http://blog.csdn.net/duan19920101/article/details/50617190/

     

    建立vector

    #include <vector>

    vector<data-type> name;

     

    使用迭代器访问元素

    vector<int>::iterator it;

    for(it=vec.begin();it!=vec.end();it++)

    cout<<*it<<endl;

     

    向vector添加元素

    尾插:name.push_back(element); 这样name[0]=element;

    任意插:name.insert(vec.begin()+i,a); 在i个元素前面插入a;

     

    #include<vector>

    #include<iostream>

    using namespace std;

     

    int main()

    {

    vector<int> v(3);

    v[0]=2; //v[0]是第0个元素

    v[1]=7;

    v[2]=9;

    v.insert(v.begin(),8);//在最前面插入新元素。

    v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素

    v.insert(v.end(),3);//在向量末尾追加新元素。

     

    v.insert(v.end(),4,1);//在尾部插入4个1

     

    int a[] = {1,2,3,4};

    v.insert(v.end(),a[1],a[3]);//在尾部插入a[1]个a[3]

     

    vector<int>::iterator it;

    for(it=v.begin(); it!=v.end();it++)

    {

    cout<<*it<<" ";

    }

    cout<<endl;

     

    return 0;

    }

     

    //8 2 1 7 9 3 1 1 1 1 4 4

    //请按任意键继续. . .

     

     

     

    删除vector内元素

    name.erase(name.begin()+i); 删除第i+1个元素

    vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

     

    vector大小 name.size();

     

    vector初始化

    //初始化size,但每个元素值为默认值

    vector<int> abc(10); //初始化了10个默认值为0的元素

    //初始化size,并且设置初始值

    vector<int> cde(10,1); //初始化了10个值为1的元素

     

    vector查询

    #include <algorithm>

    if(find(vector.begin(), vector.end(), val) != vector.end()){

    //找到

    }else{

    //没找到

    }

     

    vector的排序

    #include <algorithm>

    sort(vector.begin(),vector.end());

    (默认是按升序排列,即从小到大).

    可以通过重写排序比较函数按照降序比较,如下:

    定义排序比较函数:

    bool Comp(const int &a,const int &b)

    {

    return a>b;

    }

    调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。

     

     

     

    vector的翻转 #include <algorithm> reverse(vec.begin(),vec.end());

     

    vector二维数组 vector< vector<type> > name //注意<<不能连写,得有空格

     

    vector二维数组的赋值

    vector<vector<string> > v;

    for(int i = 0; i < 3; i++) {

    string s;

    getline(cin, s);

    vector<string> row;

    int j = 0, k = 0;

    while(j < s.length()) {

    if(s[j] == '[') {

    while(k++ < s.length()) {

    if(s[k] == ']') {

    row.push_back(s.substr(j+1, k-j-1));

    break;

    }

    }

    }

    j++;

    }

    v.push_back(row);

    }

     

     

    Tips:

    vector相当于一个size可变的数组。相比于数组,vector会消耗更多的内存以有效的动态增长。vector能更快的索引元素,而且能相对高效的在尾部插入和删除元素。

    常和#include<algorithm>同用

    reverse(name.begin(),name.end()); 逆序排列

    sort(name.begin(),name.end()) ; 升序排列

    特别注意:

    • 如果你要表示的向量长度较长(需要为向量内部保存很多数),容易导致内存泄漏,而且效率会很低;

    #include <cctype>

    http://blog.csdn.net/bat67/article/details/52021803

     

    int tolower(char) 若char是大写字母('A'-'Z')返回相应的小写字母('a'-'z')的ASCII码

    int toupper(char) 若char是小写字母('a'-'z')返回相应的大写字母('A'-'Z')的ASCII码

    int isupper(int ch) 若ch是大写字母('A'-'Z')返回非0值,否则返回0

    int islower(int ch) 若ch是小写字母('a'-'z')返回非0值,否则返回0

     

    int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0值,否则返回0

    int isdigit(int ch) 若ch是数字('0'-'9')返回非0值,否则返回0

    int isalnum(int ch) 若ch是字母('A'-'Z','a'-'z')或数字('0'-'9') 返回非0值,否则返回0

     

    sample:

    #include<ctype.h>

    #include<stdio.h>

    int main()

    {

    char str[]="I love ShangHai";

    //将字符串中的小写字母转化为大写字母

    int i=0;

    char c;

    while (str[i])

    {

    c=str[i];

    if (islower(c)) str[i]=toupper(c);

    i++;

     

    }

    printf("%s ",str);

    }

     

    1033

    #include <iostream>

    #include <cctype>

    using namespace std;

    int main() {

    string bad, should;

    getline(cin, bad); //为了防止第一行是空的,不能用cin >> ,用getline(cin, ...)

    getline(cin, should);

    for (int i = 0, length = should.length(); i < length; i++) {

    if (bad.find(toupper(should[i])) != string::npos) continue;

    if (isupper(should[i]) && bad.find('+') != string::npos) continue;

    cout << should[i];

    }

    return 0;

    }

    1014

    #include <iostream>

    #include <cctype>

    using namespace std;

    int main() {

    string a, b, c, d;

    cin >> a >> b >> c >> d;

    char t[2];

    int pos, i = 0, j = 0;

    while(i < a.length() && i < b.length()) {

    if (a[i] == b[i] && (a[i] >= 'A' && a[i] <= 'G')) {

    t[0] = a[i];

    break;

    }

    i++;

    }

    i = i + 1;

    while (i < a.length() && i < b.length()) {

    if (a[i] == b[i] && ((a[i] >= 'A' && a[i] <= 'N') || isdigit(a[i]))) {

    t[1] = a[i];

    break;

    }

    i++;

    }

    while (j < c.length() && j < d.length()) {

    if (c[j] == d[j] && isalpha(c[j])) {

    pos = j;

    break;

    }

    j++;

    }

    string week[7] = {"MON ", "TUE ", "WED ", "THU ", "FRI ", "SAT ", "SUN "};

    int m = isdigit(t[1]) ? t[1] - '0' : t[1] - 'A' + 10;

    cout << week[t[0]-'A'];

    printf("%02d:%02d", m, pos);

    return 0;

    }

     

     

    #inlcude <map>

     

    自动建立Key - value的对应。key 和 value可以是任意你需要的类型。

     

    map的定义

    map<int, string**//typename> name**

    map的访问

    数组访问:map[0] map['a''] map["ans"]...

     

     

    数据的构造,插入

    #include<map>

    int main(){

    map<int,string>mapStudent;

    mapStudent.insert(pair<int,string>(1,"student_one"));

    return 0;

    }

     

    int main(){

    map<int,string>mapStudent;

    mapStudent.insert(map<int,string>::value_type(1,"student_one"));

    return 0;

    }

     

    //遍历:

    map<string,CAgent>::iterator iter;

    for(iter = m_AgentClients.begin(); iter != m_AgentClients.end(); ++iter)

    {

    if(iter->first=="8001") {

    this->SendMsg(iter->second.pSocket,strMsg);//iter->first

    }

    }

    //查找:

    map<string,CAgent>::iterator iter=m_AgentClients.find(strAgentName);

    if(iter!=m_AgentClients.end())//有重名的 {

    }

    else //没有{

    }

    //元素的个数

    if (m_AgentClients.size()==0)

     

    1069

    #include <iostream>

    #include <map>

    using namespace std;

    int main() {

    int m, n, s;

    scanf("%d%d%d", &m, &n, &s);

    string str;

    map<string, int> mapp;

    bool flag = false;

    for (int i = 1; i <= m; i++) {

    cin >> str;

    if (mapp[str] == 1) s = s + 1;

    if (i == s && mapp[str] == 0) {

    mapp[str] = 1;

    cout << str << endl;

    flag = true;

    s = s + n;

    }

    }

    if (flag == false) cout << "Keep going...";

    return 0;

    }

     

    #include <set>

    http://blog.csdn.net/yas12345678/article/details/52601454

    set主要用于自动去重并按升序排序

    set<int> test;

     

    set插入数值: test.insert(0);

    //不是使用push_back()哦

     

    set删除一个特定数值 : test.erase(test.find(0));

     

    清空set test.clear();

     

    注意**set的遍历**

    set<int>::iterator = it;

    for(it = test.begin();it!=test.end();it++){

    XXXXX

    }

    • 反向迭代器:

    set<int>::reverse_iterator = it;

    it.rbegin() 返回一个逆序迭代器,它指向容器it的最后一个元素

    it.rend() 返回一个逆序迭代器,它指向容器it的第一个元素前面的位置

     

     

    C/C++的输入

    http://blog.csdn.net/JIEJINQUANIL/article/details/50802902

    1052 1058

    getchar(); 吸收诸如'()’、'【】'

    http://blog.csdn.net/zcmuczx/article/details/53926178

    http://blog.csdn.net/zcmuczx/article/details/53926352

    1.cin最常见,不再多赘述,注意它在遇“空格”、“TAB”、“回车”都结束

    2.cin.get(); 用来接收字符,可以接受“空格”

    char c;

    while(1){

    c = cin.get();

    cout<<c;

    if(c==' '){

    break;

    }

    }

    • (chat c = cin.get()) != EOF

    #include <iostream>

    using namespace std;

    int main() {

    int map[128] = {0}, c;

    while ((c = cin.get()) != EOF) map[c]++;

    while (map['P'] > 0 || map['A'] > 0 || map['T'] > 0 || map['e'] > 0 || map['s'] > 0 || map['t'] > 0) {

    if (map['P']-- > 0) cout << 'P';

    if (map['A']-- > 0) cout << 'A';

    if (map['T']-- > 0) cout << 'T';

    if (map['e']-- > 0) cout << 'e';

    if (map['s']-- > 0) cout << 's';

    if (map['t']-- > 0) cout << 't';

    }

    return 0;

    }

     

     

    3.cin.getline(); 接受一个字符串,可以接受“空格”并输出

    #include <iostream>

    using namespace std;

    void main ()

    {

      char m[20];

      cin.getline(m,5);

      cout<<m<<endl;

    }

    //cin.getline()实际上有三个参数,cin.getline(接受字符串的首地址,接受个数5,结束字符)

    //当第三个参数省略时,系统默认为’’

     

    4.getline() 接受一个字符串,可以接收空格并输出,需包含“#include <string>

    • 和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的 两个函数

    string str;

    getline(cin,str);

     

    //不可以和cin连用,但可以和scanf连用

     

    //错误示范

    /*

    cin>>n;

    //应该修改为:

    //scanf("%d ",&n);

    for(int i=0;i<n;i++){

    string str;

    getline(cin,str);

    }

    */

     

     

     

     

    5.特别的输入

    #include <iostream>

    using namespace std;

    int main() {

    int a, b, flag = 0;

    while (cin >> a >> b) {

    if (flag == 0 && b == 0) cout << "0 0";

    if (b != 0) {

    if (flag == 1) cout << " ";

    cout << a * b << " " << b - 1;

    flag = 1;

    }

    }

    return 0;

    }

     

    6.格式化输入

     

     

    C/C++输出格式控制

    C++在输出格式控制方面过于繁琐,PAT中遇到特定格式输出,建议使用C。

    但是要注意,一旦想选择C,所有输入输出都用C(即scanf("%d",&m); printf("%03d",m);)

    http://blog.csdn.net/u010879456/article/details/53404757

     

    C语言的基本输出格式:

    https://www.cnblogs.com/renxinyuan/p/3862772.html

    基本格式:

    %c 字符

    %d 整形

    %f float或者double

    %s 字符串

    换行

     

    对齐

    "-" 有则表示左对齐输出,如省略表示右对齐输出

    “0” 有则表示空位填0.如省略表示指定空位不填 "

    "%03d" 用于控制00X式的输出

    printf("%.2f",a); 如果a是-0.04则输出-0.00 这边的负号需要考虑到

    m.n m指域宽,n指的精度,一般默认n=6 用于控制.XXX的输出

    “%.Xf” 用于控制0.XXXXX式的输出,结果自动四舍五入

     

    结构体

    结构体排序

    #include <iostream>

    #include <algorithm>

    #include <string>

     

    using namespace std;

    struct Person{

    string name;

    int age;

    };

    bool cmp(Person a,Person b){ //名字从小到大,同名情况下年龄从大到小

    if(a.name!=b.name){

    return a.name<b.name;

    } else {

    return a.age>b.age;

    }

    }

    int main(){

    Person p[3];

    int i,j;

    for(i=0;i<3;i++){

    cin>>p[i].name>>p[i].age;

    }

    //排序

    sort(p,p+3,cmp);

    //依次输出

    for(i=0;i<3;i++){

    cout<<p[i].name<<' '<<p[i].age<<endl;

    }

    }

     

     

     

    链表

    • 静态链表与动态链表

    1、静态链表是用类似于数组方法实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配地址空间大小。所以静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针。

    2、动态链表是用内存申请函数(malloc/new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。

     

    Hash

    • 字符串Hash

     

     

    经验

    • 用数组前,请三思,这个数据是不是一定要存在(二维)数组中,如果不用请考虑,边输入边处理输出。 (1046,1061,1066)

    • 一定要按输出格式打印出空格(" ")和换行符( )

    • 一对象多属性,结构体,了解一下

    • 输出做一个二选一的决定:cout<<(a+b<c?"true":"fale");

    • int/int 不要妄想得到一个float型的数字,要想得到 (float)int/int; 强制类型转换

    • 同时也要注意int/int,被除数不能是0,不然会得到一个很大的数

    • C语言输入数组 scanf(" % data-type",&a[i])

    • 如果觉得用if(){}else{}处理很low 请尝试switch(); case 0: XXXX,XXXXX;break;

    • 怎么求素数心里要有X数,此外求闰年(是4但不是10的倍数,是400的倍数)也是

    #include <iostream>

    #include <vector>

    using namespace std;

    bool isprime(int a) {

    for (int i = 2; i * i <= a; i++)

    if(a % i == 0) return false;

    return true;

    }

    int main() {

    int M, N, num = 2, cnt = 0;

    cin >> M >> N;

    vector<int> v;

    while (cnt < N) {

    if (isprime(num)) {

    cnt++;

    if (cnt >= M) v.push_back(num);

    }

    num++;

    }

    cnt = 0;

    for (int i = 0; i < v.size(); i++) {

    cnt++;

    if (cnt % 10 != 1) printf(" ");

    printf("%d", v[i]);

    if (cnt % 10 == 0) printf(" ");

    }

    return 0;

    }

     

     

    • 关注数据结构的基本排序

    • 是int还是long long int呢?

    • int范围:-2147483648~21474836473 题目中一般提示:不超过十位数

    • long long int: -9223372036854775808~9223372036854775807 给定区间[-2^31, 2^31]

    • 输入案例要尽可能考虑周到,尤其是考虑到特殊情况

    • 数组的初始化为一个具体的数,int a[10]={0}; //数组的元素全部初始化为0

    • 数组的查找

    int temp[100]={3,4,2,1}

    find(temp,temp+100,1)

    //返回找到的内存地址,取* 可以重新赋值如 temp[3]=1;*find(temp,temp+100,1)=2;

    //此时temp[3]=2;//如找不到 *find(temp,temp+100,1)==0

     

    • 对于模板化输入,例如XX-XX XX可以使用scanf("%d-%d %d",&a,&b,&c);

    • 在可能键值对操作(hash散列)的时候 Or 要先存再sort的时候,请三思是不是值得,换成数组(数字就用下标表示,字母-‘a’得到一个0~26的数字,亦转换成了数组下表形式的散列)是不是更便利。(求最大值这类问题,最大数组下标先用一个变量表示) 1032 1047

    • 十进制转二进制

    • 方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。

     

     

    • 输出:“@/@”的’’是转义字符,想要输出’’就要用’’表示

    • 运行超时要注意减少循环次数。如果运行超时,赶紧进入下一题,往往解决超时,伴随着方法的更变(代码的重构/写)

    • 最小公倍数与最大公约数

    http://blog.jobbole.com/106315/

    辗转相除法:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。

     

     

    最大公因子求出来了,那么最小公倍数呢?

    其实只要在运算函数里面返回两个数的积与最大公因子的比值即可,既:a*b/qcd;

     

    如果不考虑ab的大小关系

    int gcd(int a,int b){

    if(b==0){

    return a;

    }else{

    return gcd(b,a%b);

    }

    }

     

  • 相关阅读:
    poj 1273 Drainage Ditches
    网络流之--混合图的欧拉回路 出自yzmduncan.iteye.com/blog/1149049
    hdu 2203 亲和串 kmp
    hdu 1711 kmp
    KMP算法详解 出自matrix67.com
    zoj 2016 Play on Words 欧拉回路
    修改document.domain的注意事项(转)
    ActiveXObject函数详解(转)
    angularjs
    sbt
  • 原文地址:https://www.cnblogs.com/Jawen/p/11195873.html
Copyright © 2020-2023  润新知