【華爲機試】字符統計

題目描述

如果統計的個數相同,則按照ASII碼由小到大排序輸出 。如果有其他字符,則對這些字符不用進行統計。

實現以下接口:
輸入一個字符串,對字符中的各個英文字符,數字,空格進行統計(可反覆調用)
按照統計個數由多到少輸出統計結果,如果統計的個數相同,則按照ASII碼由小到大排序輸出
清空目前的統計結果,重新統計
調用者會保證:
輸入的字符串以‘\0’結尾。

輸入描述:

輸入一串字符。

輸出描述:

對字符中的
各個英文字符(大小寫分開統計),數字,空格進行統計,並按照統計個數由多到少輸出,如果統計的個數相同,則按照ASII碼由小到大排序輸出 。如果有其他字符,則對這些字符不用進行統計。

示例1

輸入

aadddccddc

輸出

dca

分析:先用一個大小爲63的容器記錄出現的字符的個數,在定義一個結構體分別定義字符本身和字符個數,把出現的字符個數和字符本身保存到結構體容器中,在對結構體容器按要求排序。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

struct charnum{
	int num;
	char its;
}; 

bool comnum(charnum a,charnum b){
	if(a.num==b.num) return a.its<b.its;  //按ASCII排序;
	return a.num>b.num;  //按個數排序;
}

inline void countchar(string s){
	if(s.empty()) return;
	int i=0;
	vector<int> count(63,0);
	while(i<s.size()){   //記錄每個字符的個數;
		if(s[i]>='a'&&s[i]<='z') count[s[i]-'a']++;
		else if(s[i]>='A'&&s[i]<='Z') count[s[i]-'A'+26]++;
		else if(s[i]>='0'&&s[i]<='9') count[s[i]-'0'+52]++;
		else if(s[i]==' ') count[62]++;
		++i;
	}
	vector<charnum> tt;   //把字符和個數保存在結構體容器;
	for(int i=0;i<count.size();++i){
		if(count[i]==0) continue;
		charnum t;
		if(i<26)  {t.num=count[i];t.its=i+'a';}
		else if(i<52) {t.num=count[i];t.its=i-26+'A';}
		else if(i<62) {t.num=count[i];t.its=i-52+'0';}
		else {t.num=count[i];t.its=' ';}
		tt.push_back(t);
	}
	sort(tt.begin(),tt.end(),comnum);   //按要求排序;
	for(int i=0;i<tt.size();++i){
		cout<<tt[i].its;
	}
	cout<<endl;
}

int main(){
	string s;
	while(getline(cin,s))
		countchar(s);
	return 0;
}

改進方法:用一個大小128的容器記錄出現的字符個數,太菜了竟然不知道有pair<>的存在,用了個結構體,現在用pair<>替代結構體的部分,總體代碼簡潔了不少。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

bool comnum(pair<char,int> a,pair<char,int> b){
	if(a.second==b.second) return a.first<b.first;
	return a.second>b.second;
}

inline void countchar(string s){
	if(s.empty()) return;
	vector<int> count(128,0);
	for(int i=0;i<s.size();++i)
		if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]>='0'&&s[i]<='9'||s[i]==' ')
			count[s[i]]++;
	vector<pair<char,int>> tt;
	for(int i=0;i<128;++i){
		if(count[i]!=0) 
			tt.push_back(make_pair(i,count[i]));
	}
	sort(tt.begin(),tt.end(),comnum);
	for(int i=0;i<tt.size();++i){
		cout<<tt[i].first;
	}
	cout<<endl;
}

int main(){
	string s;
	while(getline(cin,s))
		countchar(s);
	return 0;
}


發佈了63 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章