{ }codelper
初始化列表计数P0150

问卷回答竖直柱状图

满意度问卷让大家从 1 分到 k 分中选择,共收集了 n 个回答。
第一行给出 n 和 k,第二行给出 n 个回答,用一个空格分隔。
1 ~ k 以外的回答视为无效,不计入图中。
统计每个分数的回答数,输出竖直柱状图。
设最大的回答数为 H,柱子的行是高度从 H 到 1 的 H 行,从最上面一行(高度 H)开始输出。
每一行柱子有 k 个字符,第 j 个字符在 j 分的回答数不小于该行高度时为 '#',否则为 '.'。
柱子行之后输出分数行 "12...k"(把 1 到 k 的数字不加空格连起来)。
最后一行输出无效回答的个数。
如果一个有效回答都没有,H 为 0,不输出柱子行。

输入
1 ≤ n ≤ 1000,1 ≤ k ≤ 9,0 ≤ 回答 ≤ 20(整数)
输出
H 行柱子、分数行、无效回答的个数
样例 1 · stdin
12 5
4 5 3 4 0 4 2 5 7 4 1 5
stdout
...#.
...##
...##
#####
12345
2
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 8 种语言题解

这道题要为每个分数建一个填满 0 的列表,再逐个计数。
第 0 格是 1 分,所以加到 counts[r - 1] 上。
填充列表:Python [0] * k,JS/TS new Array(k).fill(0),Java/C# new int[k](自动为 0),C++ std::vector<int> counts(k, 0),C int counts[9] = {0};(没有初始值时局部数组从垃圾值开始),Craykon 新列表(k, 0)(韩语 새목록(k, 0))。
陷阱一:JS 只写 new Array(k) 时格子是空的,counts[r - 1]++ 会得到 undefined + 1 = NaN,而且不报错。
陷阱二:不检查范围的话,0 分的回答会变成 counts[-1]。
Python 把负下标从末尾数起,会悄悄加到最后一格(k 分);C/C++ 则会碰到数组之外的内存(未定义行为)。
一定要先判断 1 <= r <= k(Python 用连续比较,其他语言写 r >= 1 && r <= k)。
陷阱三:用 [0] * k 却加到 counts[r],k 分时会抛 IndexError。
陷阱四:回答数等于该行高度时也要涂,所以用 >=。
最大值:Python max(counts),JS/TS Math.max(...counts),C# counts.Max(),C++ *std::max_element(...),Craykon 用 数学.较大值(韩语 수학.큰수)逐个比较。

Pythonmain.py · 16 行
n, k = map(int, input().split())answers = list(map(int, input().split())) counts = [0] * k   # 0번 칸이 1점invalid = 0for r in answers:    if 1 <= r <= k:        counts[r - 1] += 1    else:        invalid += 1 top = max(counts)for level in range(top, 0, -1):   # 맨 위 줄부터    print("".join("#" if c >= level else "." for c in counts))print("".join(str(j) for j in range(1, k + 1)))print(invalid)
JavaScriptmain.js · 16 行
const [n, k, ...answers] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number); const counts = new Array(k).fill(0); // 0번 칸이 1점let invalid = 0;for (const r of answers) {  if (r >= 1 && r <= k) counts[r - 1]++;  else invalid++;} const out = [];for (let level = Math.max(...counts); level >= 1; level--) {  out.push(counts.map((c) => (c >= level ? "#" : ".")).join("")); // 맨 위 줄부터}out.push(counts.map((_, j) => j + 1).join(""));out.push(invalid);console.log(out.join("\n"));
TypeScriptmain.ts · 17 行
import { readFileSync } from "node:fs";const [n, k, ...answers]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number); const counts: number[] = new Array<number>(k).fill(0); // 0번 칸이 1점let invalid = 0;for (const r of answers) {  if (r >= 1 && r <= k) counts[r - 1]++;  else invalid++;} const out: string[] = [];for (let level = Math.max(...counts); level >= 1; level--) {  out.push(counts.map((c) => (c >= level ? "#" : ".")).join("")); // 맨 위 줄부터}out.push(counts.map((_, j) => j + 1).join(""));out.push(String(invalid));console.log(out.join("\n"));
JavaMain.java · 26 行
import java.util.Scanner; public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        int n = sc.nextInt(), k = sc.nextInt();        int[] counts = new int[k]; // Java의 int 배열은 0으로 채워져 있다. 0번 칸이 1점        int invalid = 0;        for (int i = 0; i < n; i++) {            int r = sc.nextInt();            if (r >= 1 && r <= k) counts[r - 1]++;            else invalid++;        }        int top = 0;        for (int c : counts) top = Math.max(top, c);         StringBuilder out = new StringBuilder();        for (int level = top; level >= 1; level--) { // 맨 위 줄부터            for (int c : counts) out.append(c >= level ? '#' : '.');            out.append('\n');        }        for (int j = 1; j <= k; j++) out.append(j);        out.append('\n').append(invalid).append('\n');        System.out.print(out);    }}
C#Main.cs · 30 行
using System;using System.Linq;using System.Text; class Program{    static void Main()    {        int k = int.Parse(Console.ReadLine().Trim().Split(' ')[1]);        int[] answers = Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray();         int[] counts = new int[k]; // C#의 int 배열은 0으로 채워져 있다. 0번 칸이 1점        int invalid = 0;        foreach (int r in answers)        {            if (r >= 1 && r <= k) counts[r - 1]++;            else invalid++;        }         var sb = new StringBuilder();        for (int level = counts.Max(); level >= 1; level--) // 맨 위 줄부터        {            foreach (int c in counts) sb.Append(c >= level ? '#' : '.');            sb.Append('\n');        }        for (int j = 1; j <= k; j++) sb.Append(j);        sb.Append('\n').Append(invalid).Append('\n');        Console.Write(sb);    }}
C++main.cpp · 26 行
#include <algorithm>#include <iostream>#include <string>#include <vector> int main() {    int n, k;    std::cin >> n >> k;    std::vector<int> counts(k, 0); // 0번 칸이 1점    int invalid = 0;    for (int i = 0; i < n; i++) {        int r;        std::cin >> r;        if (r >= 1 && r <= k) counts[r - 1]++;        else invalid++;    }    int top = *std::max_element(counts.begin(), counts.end());     std::string out;    for (int level = top; level >= 1; level--) { // 맨 위 줄부터        for (int c : counts) out += c >= level ? '#' : '.';        out += '\n';    }    for (int j = 1; j <= k; j++) out += std::to_string(j);    std::cout << out << "\n" << invalid << "\n";}
Cmain.c · 25 行
#include <stdio.h> int main(void) {    int n, k;    scanf("%d %d", &n, &k);    int counts[9] = {0}; /* = {0}이 없으면 지역 배열은 쓰레기 값으로 시작한다. 0번 칸이 1점 */    int invalid = 0;    for (int i = 0; i < n; i++) {        int r;        scanf("%d", &r);        if (r >= 1 && r <= k) counts[r - 1]++;        else invalid++;    }    int top = 0;    for (int j = 0; j < k; j++)        if (counts[j] > top) top = counts[j];     for (int level = top; level >= 1; level--) { /* 맨 위 줄부터 */        for (int j = 0; j < k; j++) putchar(counts[j] >= level ? '#' : '.');        putchar('\n');    }    for (int j = 1; j <= k; j++) printf("%d", j);    printf("\n%d\n", invalid);    return 0;}
Craykonmain.cray · 40 行
first = 控制台.读数字();k = first[1];answers = 控制台.读数字(); counts = 新列表(k, 0); // 0번 칸이 1점invalid = 0;遍历 (r 在 answers){    如果 (r >= 1 && r <= k)    {        counts[r - 1] = counts[r - 1] + 1;    }    否则    {        invalid++;    }} top = 0;遍历 (c 在 counts){    top = 数学.较大值(top, c);} 循环 (level = top; level >= 1; level--){    row = "";    遍历 (c 在 counts)    {        row = row + (c >= level ? "#" : ".");    }    控制台.输出(row);}labels = "";循环 (j = 1; j <= k; j++){    labels = labels + j;}控制台.输出(labels);控制台.输出(invalid);