[C++]蓝桥杯 DEV-17 统计单词数

问题描述
  统计输入英文文章段落中不同单词(单词有大小写之分,  但统计时忽略大小写)各自出现的次数。 输入段落中所含单词的总数不超过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()函数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值