洛谷P1598垂直柱状图

柱状图(luogu.com.cn)https://www.luogu.com.cn/problem/P1598

一、题目链接

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];

之后就是图形的输出了

  1. 图形输出就是将最大值设为外层循环,变量i等于目前的最大值,之后i逐次递减,每次都循环遍历每个数组0-25位置上是否有字幕出现次数等于i的若有,输出“* ”另外输出 “ ”
  2. 每次询问完当前i之后,再换行
  3. 最后在图形末尾打印字母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

我是按照我个人的习惯写的解题报告,可能有些难点被忽略了,所以如果发现看不懂的地方,请务必在评论区指出,互相学习,互相督促,互相成长!共勉!

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值