柱状图(luogu.com.cn)https://www.luogu.com.cn/problem/P1598
一、题目链接
二、题目简介
用柱状条形统计图来统计每个字母的出现次数,并用‘*’符号来代表出现的次数
三、涉及知识点
这道题涉及的知识点如下:
如果都已经掌握,请自行将这道题过掉;如果没有掌握,请务必先将这些知识点进行掌握。
四、算法分析
首先使用数组将每个字母代表的ascall码来存入数组,例如arr[A]=1,在内存中的显示为 arr[65]
=1,但是数组只需要长度为26 的数组,所以这里咱们做一个操作,arr[s.charAt(i)-'A']++;这样每次的数组都将从在arr[0]-arr[25]之间,之后可以在通过for循环得到数组中出现次数最多的为多少次,这里设为max
for(int i=0;i<26;i++){
if(max>arr[i])
max=arr[i]
}
//不过我这里为了省事通过又新建了一个临时数组,将原有数组赋值给临时数组,之后将临时数组排序,Arrays.sort(arr2)
max=arr2[25];
之后就是图形的输出了
- 图形输出就是将最大值设为外层循环,变量i等于目前的最大值,之后i逐次递减,每次都循环遍历每个数组0-25位置上是否有字幕出现次数等于i的若有,输出“* ”另外输出 “ ”
- 每次询问完当前i之后,再换行
- 最后在图形末尾打印字母A-Z
五、源码讲解
1.这里是代码部分
Scanner scanner = new Scanner(System.in);
// 65----95
int arr[] = new int[26];
int arr2[] = new int[26];
for (int j = 0; j < 4; j++) {
String string1=scanner.nextLine();
for (int i = 0; i < string1.length(); i++) {
if (string1.charAt(i)>='A'&&string1.charAt(i)<='Z') {
arr[string1.charAt(i) - 'A']++;
arr2[string1.charAt(i) - 'A']++;
}
}
}
Arrays.sort(arr2);
int num = arr2[arr.length-1];
2.下面是输出时的代码
首先将出现最多次数的赋值给i 这里是如果第二个循环内的数组等于当前最大值的话,在当前数组所在的列上面打印第一个标记,之后num--,如果有数组的值等于当前的i,则打印“*”不相等则输出“ ”
for (int i = num; i >=1; i--) {
for (int k = 0; k <= 25; k++) {
if (arr[k] == i) {
arr[k]--;
System.out.print("* ");
}
else
System.out.print(" ");
}
System.out.println();
}
System.out.print("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
详细代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
// 65----95
int arr[] = new int[26];
int arr2[] = new int[26];
for (int j = 0; j < 4; j++) {
String string1=scanner.nextLine();
for (int i = 0; i < string1.length(); i++) {
if (string1.charAt(i)>='A'&&string1.charAt(i)<='Z') {
arr[string1.charAt(i) - 'A']++;
arr2[string1.charAt(i) - 'A']++;
}
}
}
Arrays.sort(arr2);
int num = arr2[arr.length-1];
for (int i = num; i >=1; i--) {
for (int k = 0; k <= 25; k++) {
if (arr[k] == i) {
arr[k]--;
System.out.print("* ");
}
else
System.out.print(" ");
}
System.out.println();
}
System.out.print("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
}
}
六、FAQ
我是按照我个人的习惯写的解题报告,可能有些难点被忽略了,所以如果发现看不懂的地方,请务必在评论区指出,互相学习,互相督促,互相成长!共勉!