- 题目链接:7-46 新浪微博热门话题
- 考查知识:字符串
- 题意描述:
- 给定n条微博,每条微博里有若干话题,试统计被最多条微博提到的话题。
- 思路简析:
- 首先对#号位置进行记录,然后用
a.substr(开始截取位置,子串长度)
截取子串 - 遍历子串所有字符
- 是字母
isalpha(b[j])
,首字母大写toupper(b[j])
,其他字母小写tolower(b[j])
- 不是数字
!isdigit(b[j])
,都转化为空格 - 多个连续的空格自动合并成一个,前导后续空格也省略掉
b.erase(j,1)
- 是字母
- 首先对#号位置进行记录,然后用
- 具体代码
#include<bits/stdc++.h> using namespace std; int main(){ int n,mx=-1; cin>>n; getchar(); map<string,int>m;//话题,被多少条微博提到 for(int i=0;i<n;i++){//输入 stack<int>s; string a,b; getline(cin,a); int z=a.size(); for(int j=0;j<z;j++){//保存所有#的位置 if(a[j]=='#')s.push(j); } map<string,int>m2;//话题,本条微博中该话题是否出现 while(s.size()){//每次取出2个#的位置 int x=s.top();s.pop(); int y=s.top();s.pop(); int z=x-y-1,f=0;//z:子串长度 f:标记首字母 b=a.substr(y+1,z);//提取 2个#之间的内容 for(int j=0;j<z;j++){ if(isalpha(b[j])){//字母,首字母大写,其他字母小写 if(f++)b[j]=tolower(b[j]); else b[j]=toupper(b[j]); }else if(!isdigit(b[j]))b[j]=' ';//不是数字,都转化为空格 } for(int j=0;j<z;j++){//多个连续的空格自动合并成一个,前导后续空格也省略掉 if(j==0&&b[j]==' ')b.erase(j,1),z--,j--; if(b[j]==' '&&j+1<z&&b[j+1]==' ')b.erase(j,1),z--,j--; } for(int j=z-1;j>=0;j--){ if(j==z-1&&b[j]==' ')b.erase(j,1),z--,j++; } if(!m2[b]){//该话题在该条微博中第一次出现,更新mx m2[b]=1; mx=max(mx,++m[b]); } } } int cn=0;//找出现最多话题的个数 for(auto it=m.begin();it!=m.end();it++){ if(mx==it->second){ cn++; if(cn==1)cout<<it->first<<endl<<it->second<<endl; } } if(cn>1)cout<<"And "<<cn-1<<" more ..."; return 0; }
7-46 新浪微博热门话题(字符串)
最新推荐文章于 2024-03-24 16:16:05 发布