字符串的可视化

题目描述

在实际生活中,我们对于乱序的数据感到迷惑,并且很难把握住数据的价值,所以我们使用各种各样的手段来进行数据分析,在数据分析之后,数据的可视化也同样重要,优秀的可视化成果往往会放大数据的隐藏价值,进而影响我们的生活。

现在请聪明的你运用排序的分析方法对我们给出的字符串进行处理,并对其结果进行可视化,在这里我们选定绘制类似柱状图的方法进行可视化。

输入格式

一行一个字符串,只包含有大小写字母。

输出格式

输出应该有数行,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次。
第一次排序是先对次数排,不排字母,新的次数序列用另一个数组存 
然后对于字母,根据最大次数(每次循环减一)输出对应次数的字母(从左到右找 ,
如果次数相同的,就只用根据现成的字母顺序输出了 
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值