愿尔安然无恙


私信TA

用户名:H2130819045

访问量:13839

签 名:

向往星辰大海,喜欢落日晚风。

等  级
排  名 63
经  验 10720
参赛次数 16
文章发表 56
年  龄 20
在职情况 学生
学  校 贺州学院
专  业 软件工程

  自我简介:

不想改bug ^_^

解题思路: 把问题分成多个小问题,一个一个处理,读入字符串后,先分离单词,变大写,去符号,放入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 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

  • «
  • »