0
点赞
收藏
分享

微信扫一扫

洛谷P1598 垂直柱状图(字符串,模拟)

金刚豆 2022-03-11 阅读 36

【题目描述】
写一个程序从输入文件中读取四行大写字母(全都是大写的,每行不超过 100 100 100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。

【输入格式】
四行字符,由大写字母组成,每行不超过 100 100 100个字符

【输出格式】
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。

【输入样例】

THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!

【输出样例】

                            *
                            *
        *                   *
        *                   *     *   *
        *                   *     *   *
*       *     *             *     *   *
*       *     * *     * *   *     * * *
*       *   * * *     * *   * *   * * * *
*     * * * * * *     * * * * *   * * * *     * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

【分析】


首先我们要统计出每个字母出现的次数 c n t cnt cnt,并且记下出现次数的最大值 m a x v maxv maxv

由于每行末尾不能出现多余的空格,因此我们遍历所有的出现次数 1 ∼ m a x v 1\sim maxv 1maxv,找到出现次数大于等于 i i i的最后一个位置 j j j,记为 l a s t [ i ] = j last[i]=j last[i]=j

由于我们从上往下输出,因此我们从 m a x v maxv maxv开始从大到小遍历每个出现次数 i i i,对于每个 i i i,我们再从左往右遍历每个字母 j ( 0 ≤ j ≤ l a s t [ i ] ) j(0\le j\le last[i]) j(0jlast[i]),即将 A ∼ Z A\sim Z AZ映射为 0 ∼ 25 0\sim 25 025,如果 c n t [ j ] ≥ i cnt[j]\ge i cnt[j]i,那么输出*,否则输出空格。


【代码】

#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;

int maxv;
int cnt[30], last[410];
string s;

int main()
{
    for (int i = 0; i < 4; i++)
    {
        getline(cin, s);
        for (int i = 0; i < s.size(); i++)
            if (s[i] >= 'A' && s[i] <= 'Z') cnt[s[i] - 'A']++, maxv = max(maxv, cnt[s[i] - 'A']);
    }
    for (int i = 1; i <= maxv; i++)
        for (int j = 0; j < 26; j++)
            if (cnt[j] >= i) last[i] = j;
    for (int i = maxv; i; i--)
    {
        for (int j = 0; j <= last[i]; j++)
        {
            if (cnt[j] >= i) cout << '*';
            else cout << ' ';
            if (j != last[i]) cout << ' ';
        }
        cout << endl;
    }
    for (int i = 0; i < 26; i++)
    {
        cout << (char)(i + 'A');
        if (i < 26 - 1) cout << ' ';
    }
    return 0;
}
举报

相关推荐

0 条评论