1 条题解

  • 0
    @ 2022-2-2 7:00:15

    【深基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;
    }
    
    • 1

    信息

    ID
    115
    时间
    1000ms
    内存
    125MiB
    难度
    进阶
    标签
    递交数
    2
    已通过
    1
    上传者