经典指数          
原因
2423
浏览数
0
收藏数
 

图书馆最近新进了一批书,管理员们需要把这些书按照所属类别以及书名分别放置在不同的书架上。但由于书太多了,这可忙坏了管理员们,你能帮他们整理一下这些新书吗? 输入描述: 输入包含多组数据。每组数据第一行包含一个正整数n (1≤n≤1000)。紧接着n行,每行包含一个书名和这本书的所属类别。书名和类别名都只有字母构成,并且长度均不超过32个字符。 输出描述: 对应每一组数据,按照要求先按照类别排序(大小写无关),再按照书名排序(大小写无关),最后输出排好序的书名,每一个书名占一行。每一组数据之后输出一个空行做分隔符。 输入例子: 3JavaScriptInAction ProgrammingOnLisp LispLetOverLambda Lisp3abc ZZZXXX AAADEF AAA 输出例子: LetOverLambdaOnLispJavaScriptInActionDEFXXXabc

     举报   纠错  
 
切换
1 个答案
使用map和set,通过自定义大小写无关的比较器来实现。 数据结构为:map, bookSort> 其中,map的key值为目录名,value值为一个set。set为按照书名排序的集合。bookSort为按照大小写无关字典升序排列的比较器。 #include #include #include #include #include using namespace std; class bookSort : public less // 定义升序比较器 { public: // 定义大小写无关的比较器 bool operator()(string a, string b) const { for (char & ch : a) ch = tolower(ch); for (char & ch : b) ch = tolower(ch); return a < b; // 返回字典序 } }; vector solve(map, bookSort> & store) { vector list; // 对于mao中的每一个key(目录名)值,输出对应的所有value(书名)。 for (auto pairs : store) { string category = pairs.first; // 目录名 for (auto name : store[category]) // 每个书名 list.push_back(name); // 将书名存入到最终输出列表内 } return list; // 输出列表返回给main函数 } int main() { int n, flag = 0; while (cin >> n && n) { map, bookSort> store; string name, category; for (int i = 0; i < n; ++i) { cin >> name >> category; // 读入目录名和书名 store[category].insert(name); // 根据目录名,将书名插入到 set 集合 } vector list = solve(store); // 获取处理后的书名列表 for (auto str : list) // 输出所有书名 cout << str << endl; cout << endl; } return 0; }
 
切换
撰写答案