-
题目大意:找口头禅:找出一个句子中出现次数最多的词(可由字母和数字组成),大小写不敏感。
-
思路:将每个词变小写,存到map里,然后将map的键值对存到数组里,将数组按次数从大到小排序,若次数相同就按字母排序
- 单词是由连续的alphanum组成的,由非alphanum分开;
- 注意,若最后一个字符为alphanum,也该将这部分单词存入map
- 最后应将出现次数最多的词输出,若有多个词,就输出字母最小的那个(自定义cmp函数)
- 单词是由连续的alphanum组成的,由非alphanum分开;
-
知识点:
-
map
-
vector
-
sort
-
isalnum()
-
getline()
-
-
代码:
#include <iostream> #include <string> #include <map> #include <vector> #include <algorithm> using namespace std; struct node{ string word; int n; }; bool cmp(node n1, node n2){ return n1.n != n2.n ? n1.n > n2.n : n1.word < n2.word; } int main(){ string s, temp = ""; map<string, int> m; vector<node> v; getline(cin, s); // 字符串有空格,用getline int aa = s.length(); for(int i = 0; i < s.length(); i++){ if(!isalnum(s[i])) { if(i != 0 && isalnum(s[i - 1])){ m[temp]++; temp = ""; continue; } }else{ if(s[i] >= 'A' && s[i] <= 'Z') // 将大写转小写 temp += tolower(s[i]); else temp += s[i]; if(i == s.length() - 1) // 注意:还要考虑最后一个字符是alphanum的情况!!! m[temp]++; } } for(auto it = m.begin(); it != m.end(); it++){ // 将map的内容存到vector里再排序 v.push_back({it->first, it->second}); } sort(v.begin(), v.end(), cmp); printf("%s %d", v[0].word.c_str(), v[0].n); return 0; }
-
总结:
- 字符串有空格,用
getline()
- 第一次提交代码时有一个段错误,经过漫长的检查和调试,发现错误在我没考虑最后一个单词是alphanum的情况。
- 在排序有很多要求时,结构体真的很好用!
- 字符串有空格,用
【PAT】1071 Speech Patterns (25 分)
最新推荐文章于 2021-08-31 20:34:36 发布