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,处理一下每个字母的出现次数和每一行的#个数,再进行一次冒泡排序。

posted @ 2022-05-06 09:36  misasteria  阅读(92)  评论(0编辑  收藏  举报