题目连接点我
思路如下
- buf 数组存储每个字母出现的数量,也就是星号*的数量;arr数组存储每个字母空格 的数量 (即与最大字母数出现的数量之差);
- 遍历找出字母出现个数最多的数量m;
- 两层for循环打印输出,行为次数最大值m,列为26。arr[j]<m-buf[j]才输出空格,否则输出星号* ,每次输出空格后++,详见代码;
- 题目要求任一行末尾不能有多余空格,所以输出第一个或者最后一个时需要特殊处理一下,当然本题输出多余空格也能过。
代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <sstream>
#define inf 0x3f3f3f3f
#define eps 1e-6
using namespace std;
#define clr(x) memset(x,0,sizeof((x)))
const int maxn = 1e4+1;
#define MAX(a,b,c) ((a)>(b)?((a)>(c)?(a):(c)):((b)>(c)?(b):(c)))
#define _max(a,b) ((a) > (b) ? (a) : (b))
#define _min(a,b) ((a) < (b) ? (a) : (b))
#define _for(a,b,c) for(int a = b;a<c;a++)
int buf[26],arr[26];
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
char s[100];
while(scanf("%s",s)!=EOF) {
int len = strlen(s);
for(int i = 0;i<len;i++) {
if(isalpha(s[i]))
buf[s[i]-'A']++;
}
}
int m = -inf;
for(int i = 0;i<26;i++) {
if(buf[i]>m)m = buf[i];
}
for(int i = 0;i<m;i++) {
if(arr[0]<m-buf[0]){
arr[0]++;
cout<<" ";
}else cout<<"*";
for(int j=1;j<26;j++) {
if(arr[j]<m-buf[j]){
arr[j]++;
cout<<" ";
}
else cout<<" *";
}
cout<<endl;
}
cout<<"A";
for(int k = 1;k<26;k++) {
printf(" %c",65+k);
}
return 0;
}