解题思路: 把问题分成多个小问题,一个一个处理,读入字符串后,先分离单词,变大写,去符号,放入map去重,统计个数,找最长单词,用vector找输入顺序,格式化输出;
注意事项: 因为要实现的功能有点多,所以用到了7个头文件,要是不喜欢太多,可以换成万能头文件:#include
#include <iostream> #include <map> #include <sstream> #include <string> #include <vector> #include <algorithm> #include <iomanip> using namespace std; int main() { int max=0; string str,w,ww; vector<string> v1; map<string,int> s,flags; getline(cin, str);//string类按行读入 istringstream ss(str);//一个构造函数,用于分离有空格的字符串 while (ss >> w) { ww="";//每次统计从空开始 transform(w.begin(),w.end(),w.begin(),::toupper);//把string类的单词转换为大写,反之::tolowwer for(int i=0;i<w.size();i++) { if(w[i]>='A'&&w[i]<='Z')//去除多余符号 ww+=w[i];//string 类不能一个一个赋值(ww[i]=w[i]),应该用自加的方式实现部分赋值,但对于字符串本身可以; } v1.push_back(ww);//把输入的所有单词存入vector,不会去重,也不会排序,使用尾插能实现按输入顺序保存单词 s[ww]++;//存入map容器,统计单词出现次数,会根据键值从小到大自动排序并去重, } map<string,int>::iterator it;//定义迭代器 for(it=s.begin();it!=s.end();it++) { if(it->first.size()>max)//查找最长单词,键值也可以size,很棒 max=it->first.size(); } for(int k=0;k<v1.size();k++) { for(it=s.begin();it!=s.end();it++) { if(v1[k]==it->first&&flags[it->first]==0)//按照输入顺序查找并输出 { flags[it->first]=1;//标记为1,代表已经输出过一次了 cout<<setw(max)<<it->first<<":";//按最大单词长度输出键值(单词),默认右对齐 for(int j=0;j<it->second;j++)//输出单词后面的星号 cout<<"*"; cout<<it->second<<endl;//输出映射数据(出现次数) } } } return 0; }//dongdong
0.0分
0 人评分