题目描述
在实际生活中,我们对于乱序的数据感到迷惑,并且很难把握住数据的价值,所以我们使用各种各样的手段来进行数据分析,在数据分析之后,数据的可视化也同样重要,优秀的可视化成果往往会放大数据的隐藏价值,进而影响我们的生活。
现在请聪明的你运用排序的分析方法对我们给出的字符串进行处理,并对其结果进行可视化,在这里我们选定绘制类似柱状图的方法进行可视化。
输入格式
一行一个字符串,只包含有大小写字母。
输出格式
输出应该有数行,51列。第2i-1列应该属于字符串里个数第i多的字母,若两个字母个数一样,字典序小的应该在前面。该列最后一行应该是这个字母的大写,然后从最后一行开始向上打印总共k个’#’号(k为该字母在字符串中的个数),每行一个。若已经打印了k个’#’,打印一个空格。第2i列应该是一个空格。输出应保证输出的字母在同一行,且无空行。
样例输入
WoJueDeBianChengZhenDeShiTaiYouQueLa
样例输出
#
#
#
# # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # # # # #
E A H I N U D O B C G J L Q S T W Y Z F K M P R V X
数据范围
字符串长度不超过10000.
# include<stdio.h>
# include<string.h>
/*现在请聪明的你运用排序的分析方法对我们给出的字符串进行处理,
并对其结果进行可视化,在这里我们选定绘制类似柱状图的方法进行可视化。
输入格式
一行一个字符串,只包含有大小写字母。
输出格式
输出应该有数行,51列。第2i-1列应该属于字符串里个数第i多的字母,
若两个字母个数一样,字典序小的应该在前面。该列最后一行应该是这个字母的大写,
然后从最后一行开始向上打印总共k个’#’号(k为该字母在字符串中的个数),
每行一个。若已经打印了k个’#’,打印一个空格。第2i列应该是一个空格。
输出应保证输出的字母在同一行,且无空行。
样例输入
WoJueDeBianChengZhenDeShiTaiYouQueLa
样例输出
#
#
#
# # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # # # # #
E A H I N U D O B C G J L Q S T W Y Z F K M P R V X
数据范围
字符串长度不超过10000.*/
int main()//结尾有法二
{
char letter[26] = {'\0'};//储存26个字母
int put[26] = {0};//储存26个字母的次数
char str[10001] = {'\0'};
int temp1;
char temp2;
char *p;
int max;
scanf("%s", str);
for(int i = 0;i < 26; i ++) //在letter中存字母
{
letter[i] = 'A' + i;
}
for(int i = 0; str[i] != '\0'; i ++)
{//把字符串全部转换为大写,以便后期数次数(不分大小写
if(str[i] >= 'a' && str[i] <= 'z')
{
str[i] += 'A' -'a';
}
}
for(int i = 0; i < 26 ; i ++)//用strchar函数找字母
{
p = str;
while(strchr(p, 'A'+ i) != '\0')
{
put[i] += 1;//每找到一个,次数+1
p = strchr(p, 'A'+ i) + 1;//每找到一个,则指针+1,找下一个
}
}
for(int i = 0; i < 25; i ++)//按次数选择排序大到小
{
max = i;
for(int j = i + 1; j <= 25; j ++)
{
if(put[j] > put[max])
{
max = j;
}
}
temp1 = put[i];
put[i] = put[max];
put[max] = temp1;
temp2 = letter[i];
letter[i] = letter[max];
letter[max] = temp2;
}
for(int i = 0; i < 25; i ++)
{
for(int j = 0; j < 25 - i; j ++)
{
if(put[j] == put[j+1] && letter[j] > letter[j+1])
{//先判断次数相同,相同时则冒泡排字母
temp2 = letter[j];
letter[j] = letter[j+1];
letter[j+1] = temp2;
}
}
}
temp1 = put[0];//存最大次数
for(int row = 0; row < put[0]; row ++, temp1 --)//打印
{//每打印一行temp--,那么只要次数小于temp的,就代表那一行打印空格
for(int line = 0; line < 25; line ++)
{
if(put[line] < temp1)
{
printf(" ");
}
else
{
printf("# ");
}
}
if(put[25] < temp1)//最后一个字符后面没有空格
{
printf(" \n");
}
else
{
printf("#\n");
}
}
for(int line = 0; line < 25; line ++)
{
printf("%c ", letter[line]);
}
printf("%c\n", letter[25]);//最后一个字符后面没有空格
return 0;
}/*法二 其实不用排序2次。
第一次排序是先对次数排,不排字母,新的次数序列用另一个数组存
然后对于字母,根据最大次数(每次循环减一)输出对应次数的字母(从左到右找 ,
如果次数相同的,就只用根据现成的字母顺序输出了
*/