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