N-44. 字符串的可视化
题目描述
在实际生活中,我们对于乱序的数据感到迷惑,并且很难把握住数据的价值,所以我们使用各种各样的手段来进行数据分析,在数据分析之后,数据的可视化也同样重要,优秀的可视化成果往往会放大数据的隐藏价值,进而影响我们的生活。
现在请聪明的你运用排序的分析方法对我们给出的字符串进行处理,并对其结果进行可视化,在这里我们选定绘制类似柱状图的方法进行可视化。
输入格式
一行一个字符串,只包含有大小写字母。
输出格式
输出应该有数行,51列。第2i-1列应该属于字符串里个数第i多的字母,若两个字母个数一样,字典序小的应该在前面。该列最后一行应该是这个字母的大写,然后从最后一行开始向上打印总共k个’#’号(k为该字母在字符串中的个数),每行一个。若已经打印了k个’#’,打印一个空格。第2i列应该是一个空格。输出应保证输出的字母在同一行,且无空行。
这个题没怎么细想,时间复杂度稍微高了一点,但是无关紧要
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return a > b ? a : b;
}
char s[100010];
int a[26] = {0}, b[100010] = {0}, c[26] = {0};
int main () {
int cnt = 0;
scanf("%s", s);
for (int i = 0; i < strlen(s); i++) {
if (s[i] >= 'a' && s[i] <= 'z') a[s[i] - 'a'] ++, b[a[s[i] - 'a']] ++, cnt = max(cnt, a[s[i] - 'a']);
else a[s[i] - 'A'] ++, b[a[s[i] - 'A']] ++, cnt = max(cnt, a[s[i] - 'A']);
}
for (int i = 0; i < 26; i++) c[i] = i;
for (int i = 0; i < 26; i++) {
for (int j = 0; j < 25; j++) {
if (a[j] < a[j + 1]) {
int t1 = a[j], t2 = c[j];
a[j] = a[j + 1], c[j] = c[j + 1];
a[j + 1] = t1, c[j + 1] = t2;
}
}
}
for (int i = 1; i <= cnt; i++) {
for (int j = 1; j <= b[cnt - i + 1] - 1; j++) printf("# ");
if (b[cnt - i + 1] * 2 > 51) printf("#");
else if (b[cnt - i + 1] * 2 > 0)printf("# ");
for (int j = 1; j <= 51 - 2 * b[cnt - i + 1] ; j++) printf(" ");
printf("\n");
}
for (int i = 0; i < 26; i++)
if (i != 25) printf("%c ", c[i] + 'A');
else printf("%c", c[i] + 'A');
printf("\n");
return 0;
}
整体的思路就是把a-z映射到0-25,处理一下每个字母的出现次数和每一行的#个数,再进行一次冒泡排序。