前言
牛客网PAT乙级训练1031
题目描述
又到年底统计报表的时间了。我们公司一共生产“0”到“9”十种产品,现在给你一份销售记录,请你帮忙绘制一份直方图。
输入描述
输入包含多组数据,每组数据包含一个字符串s。
s仅包含数字,长度不超过100。
输出描述
对应每一组数据,依次为十种产品绘制高度等于其销量的'*'柱图。
直方图的高度等于数据中数量最多产品的个数,如果某种产品高度不到直方图的高度,用空格补全。
直方图下方依次输出0到9作为坐标。
输入例子
0123456789123
123012312
输出例子

输出例子
解析
解决本题需要弄清楚如下两个问题:
- 如何计算出所给字符串中0-9分别出现的次数
- 如何根据出现的次数画出直方图
针对第一个问题,只需要如下两行代码:
for (int i = 0; i < s.length(); i++)
count[s.charAt(i) - '0']++; //count[i]表示i出现的次数,此时i的范围是0-9
对于第二个问题,直方图最高的点说明这个数出现的次数最多,所以先找到最大的次数max,也就是说,max多少,最后画出的直方图就有多少行。
找到max的代码段:
//先找到最大的一个数
int max = 0;
for (int i = 0; i < 10; i++) {
if (max < count[i]) {
max = count[i];
}
}
然后,最头疼的问题就是如何画出来了。如下代码:
//此时的i表示的是行数,行数从上往下依次递减
for (int i = max; i >= 1; i--) {
for (int j = 0; j < 10; j++) {
//如果j出现的次数大于等于行数,就打印
if (count[j] >= i) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println("");
}
System.out.println("0123456789");
最后附上全部代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.next();
int count[] = new int[10];
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i) - '0']++; //count[i]表示i出现的次数
}
//开始画图
//先找到最大的一个数
int max = 0;
for (int i = 0; i < 10; i++) {
if (max < count[i]) {
max = count[i];
}
}
//此时的i表示的是行数,行数从上往下依次递减
for (int i = max; i >= 1; i--) {
for (int j = 0; j < 10; j++) {
//如果j出现的次数大于等于行数,就打印
if (count[j] >= i) {
System.out.print("*");
} else {
System.out.print(" ");
}
}
System.out.println("");
}
System.out.println("0123456789");
}
}
}