P1598 垂直柱状图
题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过100个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
输入输出样例
输入
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
输出
*
*
* *
* * * *
* * * *
* * * * * *
* * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
说明/提示
每行输出后面不允许出现多余的空格。
1 解法1: 2 3 #include<bits/stdc++.h> 4 using namespace std; 5 int main() 6 { 7 /*思路: 8 1:使用桶排序,记录每个字符串出现的次数 9 2:找到次数的组大值,然后从最大值 到1 遍历 i 10 3:每次遍历的时候,找到这里面字符 出现次数 和 i相等 ,str+"* "; 11 4:同时字符出现的个数-1 12 5:不相等的 str+=" ";最后将字符串存到vector里面 13 6:加上最后一行字符;遍历输出vector<string> 14 */ 15 int data[27]={0}; 16 string str; 17 for(int i=0;i<4;i++){ 18 getline(cin,str); 19 for(int j=0;j<(int)str.size();j++){ 20 if(str[j]>='A'&&str[j]<='Z') 21 data[str[j]-'A']++;//统计个数 22 23 } 24 } 25 26 int Max=0;//得到这里面的最大值 27 for(int i=0;i<26;i++){ 28 Max=max(Max,data[i]); 29 } 30 vector<string> v; 31 for(int i=Max;i>=1;i--){//从最大值 到1 遍历 32 str=""; 33 int id=-1;//最远的字符 和当前i个数一样的字符 34 for(int j=0;j<26;j++){//找出来这个26字母里面, 35 if(data[j]==i){ 36 id=max(id,j); 37 } 38 } 39 //然后从0-id遍历 统计 * 40 for(int j=0;j<=id;j++){ 41 if(data[j]==i){ 42 str+="* "; 43 data[j]--;//要让数量减1 44 } 45 else str+=" ";//两个空格 46 } 47 v.push_back(str);//都放进字符串里面,一直到最后一个i==1 48 } 49 str=""; 50 for(char ch='A';ch<='Z';ch++){//加上最后一行的字符 51 str=str+ch+" "; 52 } 53 v.push_back(str);//遍历输出 54 for(int i=0;i<(int)v.size();i++){ 55 cout<<v[i]<<endl; 56 } 57 return 0; 58 }