PAT-ADVANCED1022——Digital Library

版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/83926131

我的PAT-ADVANCED代码仓:https://github.com/617076674/PAT-ADVANCED

原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805480801550336

题目描述:

题目翻译:

1022 数字图书馆

数字图书馆包含数百万本书,根据其标题,作者,摘要的关键词,出版商和出版年份进行存储。 每本书都分配有一个唯一的7位数字作为其ID。 对于来自读者的任何查询,你需要输出查询到的书籍,按其ID的递增顺序排序。

输入格式:

每个输入文件包含一个测试用例。对于每个测试用例,第一行包含正整数N(<= 10 ^ 4)这是书籍的总数。然后是N个块,每个块包含6行关于书的信息:

        第1行:7位ID号码。
        第2行:书名——不超过80个字符的字符串。
        第3行:作者——一个不超过80个字符的字符串。
        第4行:关键词——每个单词是一个不超过10个字符的字符串,没有任何空格,关键字只用一个空格分隔。
        第5行:发布者——不超过80个字符的字符串。
        第6行:已发布的年份——一个4位数字,在[1000,3000]范围内。
假设每本书仅属于一位作者,并且包含不超过5个关键词;共有不超过1000个不同的关键词;并且不超过1000个不同的发布者

在书信息之后,存在包含正整数M(<= 1000)的行,其是用户的搜索查询的数量。然后是M行,每行都有如下所示的格式:

        1:书名。
        2:作者姓名
        3:一个关键词
        4:出版商的名称
        5:代表年份的4位数字

输出格式:

对于每个查询,首先在一行中打印原始查询,然后按递增顺序输出结果书ID,每个占用一行。 如果未找到任何书籍,请改为打印Not Found。

输入样例:

3
1111111
The Testing Book
Yue Chen
test code debug sort keywords
ZUCS Print
2011
3333333
Another Testing Book
Yue Chen
test code sort keywords
ZUCS Print2
2012
2222222
The Testing Book
CYLL
keywords debug book
ZUCS Print2
2011
6
1: The Testing Book
2: Yue Chen
3: keywords
4: ZUCS Print
5: 2011
3: blablabla

输出样例:

1: The Testing Book
1111111
2222222
2: Yue Chen
1111111
3333333
3: keywords
1111111
2222222
3333333
4: ZUCS Print
1111111
5: 2011
1111111
2222222
3: blablabla
Not Found

知识点:字符串

思路:用map集合保存书的信息

本题根据题意编程即可,写几个注意点。

(1)为防止超时,用char型数组保存字符串。

(2)用scanf("[^\n]", ...)的形式读取整行字符串。

(3)对于id,以int型读入,输出时需要格式化输出,不满7位的数字在前面补0。

(4)对于year,如果以int型表示,输出时也需要格式化输出,不满4位的数字在前面补0。因为题目只保证了图书的年份在[1000, 3000]之间,不保证查询时查询的年份在[1000, 3000]之间,而题目要求我们在输出结果时输出查询的信息,如果不注意这一点,无法通过测试点1。

(5)用strstr(char* s1, char* s2)来判断s2是否是s1的子串,这在查询key值时很有用。

(6)读入每行数据后,用getchar()处理未读入的换行符。

时间复杂度是O(M * N)。空间复杂度是O(N)。

C++代码:

#include<iostream>
#include<map>
#include<cstring>
#include<vector>

using namespace std;

struct book {
	int id;
	char title[81];
	char author[81];
	char key[55];
	char publisher[81];
	int year;
};

int main() {
	int N, M;
	scanf("%d", &N);
	map<int, book> bookMap;	//由id和book构成的映射表
	for(int i = 0; i < N; i++) {
		book tempBook;
		scanf("%d", &tempBook.id);
		getchar();
		scanf("%[^\n]", tempBook.title);
		getchar();
		scanf("%[^\n]", tempBook.author);
		getchar();
		scanf("%[^\n]", tempBook.key);
		getchar();
		scanf("%[^\n]", tempBook.publisher);
		getchar();
		scanf("%d", &tempBook.year);
		bookMap[tempBook.id] = tempBook;
	}
	scanf("%d", &M);
	getchar();
	char query[100];
	int queryYear;
	vector<int> results;
	for(int i = 0; i < M; i++) {
		results.clear();
		char c = getchar();
		getchar();
		getchar();
		if(c != '5') {
			scanf("%[^\n]", query);
			printf("%c: %s\n", c, query);
		} else {
			scanf("%d", &queryYear);
			printf("%c: %04d\n", c, queryYear);
		}
		getchar();
		for(map<int, book>::iterator it = bookMap.begin(); it != bookMap.end(); it++) {
			if(c == '1') {
				if(strcmp(it->second.title, query) == 0) {
					results.push_back(it->first);
				}
			} else if(c == '2') {
				if(strcmp(it->second.author, query) == 0) {
					results.push_back(it->first);
				}
			} else if(c == '3') {
				if(strstr(it->second.key, query)) {
					results.push_back(it->first);
				}
			} else if(c == '4') {
				if(strcmp(it->second.publisher, query) == 0) {
					results.push_back(it->first);
				}
			} else if(c == '5') {
				if(it->second.year == queryYear) {
					results.push_back(it->first);
				}
			}
		}
		if(results.size() == 0) {
			printf("Not Found\n");
		} else {
			for(int j = 0; j < results.size(); j++) {
				printf("%07d\n", results[j]);
			}
		}
	}
}

C++解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/83926131
今日推荐