问题描述
统计输入英文文章段落中不同单词(单词有大小写之分, 但统计时忽略大小写)各自出现的次数。 输入段落中所含单词的总数不超过100,最长单词的长度不超过20个字母.
输入格式
一个包含若干句子的段落, 每个句子由若干英文单词组成. 除空格, 逗号和句号外, 这些输入的句子中不含其他非字母字符, 并且, 逗号和句号紧跟在它前面的英文单词后面, 中间没有空格. 段落最后一个字符是回车符, 表示输入结束.
输出格式
若段落中共有M个不同的英文单词,则按照其在段落中出现的先后顺序输出M行,各行的格式为: 单词中所有字母均用大写形式输出(最长的单词顶格输出,它前面没有多余的空格; 其余单词与其右对齐)+冒号+N个*号+该单词在段落中的出现次数N
样例输入
This is a test. This test is easy. This is a test. This test is easy.
样例输出
THIS:****4
IS:****4
A:**2
TEST:****4
EASY:**2
思路:本来想用unordered_map去解决,但是运行结果如下图所示,不行啊啊啊
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
unordered_map<string,int> v;
while(cin>>s){
for(int i=0;i<s.length();i++){
if(s[i]>='A'&&s[i]<='z'){
s[i]=toupper(s[i]);
}else{
s.erase(s.length()-1);
}
}
v[s]++;
}
for(unordered_map<string,int>::iterator it=v.begin();it!=v.end();it++){
printf("%s:",it->first.c_str());
for(int i=0;i<it->second;i++)cout<<"*";
printf("%d\n",it->second);
}
return 0;
}
改进:unordered_map结合vector解决此题,主要问题就是按原来的顺序输出(但是蓝桥杯不支持C++11所以不能用unordered_map,尴尬…)
#include<bits/stdc++.h>
using namespace std;
struct word{
string a;
int num;
};
int main(){
string s;
unordered_map<string,int> v;
vector<word> b;
while(cin>>s){
for(int i=0;i<s.length();i++){
if(s[i]>='A'&&s[i]<='z'){
s[i]=toupper(s[i]);
}else{
s.erase(s.length()-1);
}
}
v[s]++;
}
for(unordered_map<string,int>::iterator it=v.begin();it!=v.end();it++){
b.push_back(word{it->first,it->second});
}
for(int j=b.size()-1;j>=0;j--){
printf("%s:",b[j].a.c_str());
for(int i=0;i<b[j].num;i++)cout<<"*";
printf("%d\n",b[j].num);
}
return 0;
}
改进2:
思路:vector+pair解决,主要是pair的first,second太好用了,哈哈哈~~
代码见:
其他好的解法:算法提高 统计单词数
改进3:
思路:map结合哈希散列去解决,目前还没想出如何设计合适的单词字符串与整数对应的散列函数(所以留个坑,以后有思路了再填,路过的小伙伴也可以看看,欢迎在评论区留言贡献你们的思路哈~~互相学习 ^ _ ^ )
没有实现的烂代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s,b[150];
map<string,int> v;
map<int,string> e;
vector<string> b;
int n=0;
while(cin>>s){
for(int i=0;i<s.length();i++){
if(s[i]>='A'&&s[i]<='z'){
s[i]=toupper(s[i]);
}else{
s.erase(s.length()-1);
}
}
v[s]++;
//
//
//
}
for(int j=0;j<n;j++){
printf("%s:",e[j].c_str());
for(int i=0;i<v[b[j]];i++)cout<<"*";
printf("%d\n",v[b[j]]);
}
return 0;
}
留坑中,等大佬填满……
解决C/C++报错error: cannot pass objects of non-trivially-copyable type ‘std::string’问题
C++ STL容器之unordered_map
其他好的解法:算法提高 统计单词数 单词没有右对齐
蓝桥杯 算法提高 vip 统计单词数 通过测评的代码,单词右对齐了
STL的unordered_map及其应用
cin.get()函数