【深基6.习8】垂直柱状图 · 教师题解

【深基6.习8】垂直柱状图

解题思路

读四行文字,统计 A~Z 次数并找最大高度。从最高层到第 1 层逐行绘制:某字母次数不小于当前层则输出星号,否则空格,列间一个空格。每行删除右侧多余空格,最后输出字母行。

正确性说明

第 h 层在某列画星号当且仅当该列柱高至少 h,故从顶到底构成准确柱状图;删除右侧空格满足输出要求而不影响有效列。

易错点

输入可能包含空格标点,只统计大写字母;不能用 >> 仅读一个词;每行末尾不留空格。

复杂度

输入长 L、最高频次 H,时间 O(L+26H),空间 O(L+26)。

参考代码(C++11)

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int cnt[26] = {};
    string s;
    for (int i = 0; i < 4; i++) {
        getline(cin, s);
        for (char c : s)
            if (c >= 'A' && c <= 'Z')
                cnt[c - 'A']++;
    }
    int H = *max_element(cnt, cnt + 26);
    for (int h = H; h >= 1; h--) {
        string row;
        for (int i = 0; i < 26; i++) {
            if (i)
                row += ' ';
            row += (cnt[i] >= h ? '*' : ' ');
        }
        while (!row.empty() && row.back() == ' ')
            row.pop_back();
        cout << row << "\n";
    }
    for (int i = 0; i < 26; i++) {
        if (i)
            cout << " ";
        cout << char('A' + i);
    }
    cout << "\n";
    return 0;
}
返回题目