PAT甲级1022 刷题记录

一、解答

#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <string>

using namespace std;
void split_string(string key_words_string,int i);

struct book
{
    int id;
    string titie;
    string author;
    vector<string> key_words;
    string publisher;
    int pub_year;
};
typedef struct book book;
vector<book> b;

set<string> titie_set;
set<string> author_set;
set<string> key_words_set;
set<string> publisher_set;

int main()
{
    int book_num;
    cin>>book_num;
    b.resize(book_num);
    for(int i=0;i<book_num;i++){
        cin>>b[i].id;
        
        string str="\n";
        getline(cin,str);
        getline(cin,b[i].titie);
        titie_set.insert(b[i].titie);
        
        getline(cin,b[i].author);
        author_set.insert(b[i].author);
        
        string key_words_string;
        getline(cin,key_words_string);
        split_string(key_words_string,i);
        
        getline(cin,b[i].publisher);
        publisher_set.insert(b[i].publisher);
        
        cin>>b[i].pub_year;
    }
    
    int q_num=0;
    cin>>q_num;
    string str="\n";
    getline(cin,str);
    
    for(int i=0;i<q_num;i++){
        string query;
        getline(cin,query);
        
        string query_deal;
        int n=0;
        n=query.find(" ");
        query_deal=query.substr(n+1,query.size()-n);
        
        cout<<query<<endl;
        
        int is_num=1;
        for(int j=0;j<query_deal.length();j++){
            if(query_deal[j]<'0'||query_deal[j]>'9'){
                is_num=0;
                break;
            }
        }

        set<int> result;
        if(is_num==1){
            int year;
            sscanf(query_deal.c_str(),"%d",&year);
            for(int j=0;j<book_num;j++){
                if(b[j].pub_year==year){
                    result.insert(b[j].id);
                }
            }
            if(result.empty()){
                cout<<"Not Found"<<endl;
            }
        }else{
            if(titie_set.find(query_deal)!=titie_set.end()){
                for(int j=0;j<book_num;j++){
                    if(b[j].titie==query_deal){
                        result.insert(b[j].id);
                    }
                }
            }else if(author_set.find(query_deal)!=author_set.end()){
                for(int j=0;j<book_num;j++){
                    if(b[j].author==query_deal){
                        result.insert(b[j].id);
                    }
                }
            }else if(key_words_set.find(query_deal)!=key_words_set.end()){
                for(int j=0;j<book_num;j++){
                    for(int k=0;k<b[j].key_words.size();k++){
                        if(b[j].key_words[k]==query_deal){
                            result.insert(b[j].id);
                            break;
                        }
                    }
                }
            }else if(publisher_set.find(query_deal)!=publisher_set.end()){
                for(int j=0;j<book_num;j++){
                    if(b[j].publisher==query_deal){
                        result.insert(b[j].id);
                    }
                }
            }else{
                cout<<"Not Found"<<endl;
            }

        }
        
        for(auto it=result.begin();it!=result.end();it++){
            printf("%07d\n",*it);
        }
    }
}

void split_string(string key_words_string,int i)
{
    int n=0;
    while(key_words_string.find(" ")!=key_words_string.npos){
        n=key_words_string.find(" ");
        string word=key_words_string.substr(0,n);
        b[i].key_words.push_back(word);
        key_words_set.insert(word);
        key_words_string=key_words_string.substr(n+1);
    }
    b[i].key_words.push_back(key_words_string);
    key_words_set.insert(key_words_string);
    return;
}

二,值得记录的知识点


(一)关于vector的使用

      1. 为了减少传参导致的耗时,vector尽量设为全局变量。

      1. vector设为未知大小的全局变量后,可以通过 变量名.resize(size) 改变大小。

b.resize(book_num);

(二)关于set的使用


      1. 关于插入元素(使用方法):

result.insert(b[j].id);

      2. 关于查找元素(使用方法):

if(titie_set.find(query_deal)!=titie_set.end()){
	. . . . . .               
}

      (1)参数:查找内容

      (1)返回值:找到返回定位器it(假设已有auto it),*it 为内容 ; 找不到返回变量名.end() 。

      3. 关于遍历元素:

for(auto it=result.begin();it!=result.end();it++){
    printf("%07d\n",*it);
}

(三)关于输入

      1. 如果主要考算法知识,输入比较简单的,可以直接用cin 。

      2. 如果输入格式固定,且各部分需要划分,可使用scanf(“格式串”,变量,变量 . . .)进行输入 。

      3. 如果需要“仅”使用换行作为分隔符,可以使用getline(cin,变量),同时有些注意事项:

      (1)头文件:#include <stdio.h>

      (1)在cin后使用,需要加上以下代码清除缓存

string str="\n";
getline(cin,str);

(三)关于string


      1. 在结构体中不可初始化 。


      2. 获取长度(使用方法):

query_deal.length()

      3. 查找字符(使用方法):

key_words_string.find(" ")

      (1)参数:字符

      (1)返回值:找到返回下标, 找不到返回 变量名.npos (敲重点)。

      4. 截取字符串(使用方法):

string word=key_words_string.substr(0,n);

      (1)参数:( 截取起点 pos,截取长度 len ),第一个默认值 pos= 0,第二个默认值 string.length() - pos ,即截到结尾。第二个使用默认值时,请不要多加逗号 。

      (1)返回值:新字符串。

      5. 关于遍历:

          无需使用迭代器,直接使用length()获取长度,s[i]读取就好

for(int j=0;j<query_deal.length();j++){
    if(query_deal[j]<'0'||query_deal[j]>'9'){
        is_num=0;
        break;
    }
}

      6. string 转 int:

          头文件:

#include <stdio.h>

          应用:

sscanf(query_deal.c_str(),"%d",&year);

          拓展:int 转 string

string i;
int a=1;
i=to_string(a);

      萌新写文,如有不足,还望指正!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值