草庐IT

2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第一部分】

尘封的CPU 2023-04-13 原文

最近回顾了Java B组的试题,深有感触:脑子长时间不用会锈住,很可怕。
兄弟们,都给我从被窝里爬起来,赶紧开始卷!!!

2022年第十三届蓝桥杯Java B组(第一部分 A~F题)

目录

一、填空题

试题 A: 星期计算

思路与题解:

试题 B: 山

思路与题解:

二、编程题

试题 C: 字符统计

思路与题解:

试题 D: 最少刷题数

思路与题解:

试题 E: 求阶乘

 思路与题解:

试题 F: 最大子矩阵

 思路与题解: 


一、填空题

试题 A: 星期计算

本题总分:5 分
【问题描述】
已知今天是星期六,请问  天后是星期几?注意用数字 1 到 7 表示星期一到星期日。

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路与题解:

    A题显然是个签到题,很多人第一思路就是“取余”,思路没错,但是如果直接暴力取余,那你就格局小了,哥们!
      因为20的22次幂(大于2^88)明显不在long类型的范围内【(2^63)-1】,那么就要分步骤做取余运算:
      根据公式: (a * b) % p = (a % p * b % p) % p 
      20^22相当于22个20做了21次乘法运算,所以我的思路是把每一次乘法的结果取余,这样,别说是long可以装得下,就算是int也手拿把掐了!

	public static void Java_B_A(){
		int n = 20;
		for(int i=0;i<21;i++)
			n = (20*n)%7;
		System.out.println((n+5)%7+1);	
	}

最终结果:7 ,即星期日。
   

试题 B:

本题总分:5 分
【问题描述】
这天小明正在学数数。他突然发现有些正整数的形状像一座“山”,比如 123565321、145541,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间 [2022, 2022222022] 中有多少个数的形状像一座“山”。

【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路与题解:

    直接暴力遍历,并判断条件,时间有点长但好用。

	public static void Java_B_B(){
		int sum = 0;
		for(int i=2022;i<=2022222022;i++) {
        	if(isUp(i)&&isMirror(i)) {
        		sum++;
        	}
        }
		System.out.println(sum);
	}
	
	public static boolean isMirror(int num){
		StringBuffer str = new StringBuffer(num+"");
		if((str.toString()).equals(str.reverse().toString()))
			return true;
		return false;
	}

	public static boolean isUp(int num){
		String st=num+"";
    	int len=st.length()%2==0?st.length()/2:st.length()/2+1;
    	for(int i=1;i<len;i++) {
    		if(st.charAt(i)<st.charAt(i-1)) {
    			return false;
    		}
    	}
    	return true;
	}

最终结果:3138 。
   

二、编程题

试题 C: 字符统计

时间限制: 1.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
  给定一个只包含大写字母的字符串 S ,请你输出其中出现次数最多的字母。如果有多个字   母均出现了最多次,按字母表顺序依次输出所有这些字母。

【输入格式】
 一个只包含大写字母的字符串 S .

【输出格式】
 若干个大写字母,代表答案。

【样例输入】
 BABBACAC

【样例输出】
 AB

【评测用例规模与约定】
 对于 100% 的评测用例,1 ≤ |S | ≤ .

思路与题解:

    本题运用Java的集合框架很容易解决。首先遍历字符串,把其中的每一种字母以键值对<字母种类,出现次数>的形式保存到HashMap中,然后遍历map提取出出现次数最多的n个字母,把它们存到list列表中,利用Collections工具类把list中字母排序,最后输出打印。

	public static void Java_B_C(){
		Scanner scanner = new Scanner(System.in);
		String input = scanner.next();
		HashMap<Character, Integer> mp = new HashMap();
		for(int i=0;i<input.length();i++){
			char ch = input.charAt(i);
			if (mp.get(ch) != null)
				mp.put(ch, (mp.getOrDefault(ch, 0)) + 1);
			else
				mp.put(ch, 1);
		}
		int maxNum = Integer.MIN_VALUE;
		List<Character> list = new ArrayList<Character>();
		for(Character c:mp.keySet()){
			if(mp.get(c)>=maxNum){
				maxNum = mp.get(c);
				list.add(c);
			}
		}
		Collections.sort(list);
		for(Character ch:list){
			System.out.print(ch);
		}
	}

试题 D: 最少刷题数

时间限制: 1.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
 小蓝老师教的编程课有 N 名学生,编号依次是 1 . . . N。第 i 号学生这学期刷题的数量是   
 对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题比他多的学生数不   超过刷题比他少的学生数。

【输入格式】
 第一行包含一个正整数 N。
 第二行包含 N 个整数: ,. . . , .

【输出格式】
 输出 N 个整数,依次表示第 1 . . . N 号学生分别至少还要再刷多少道题。

【样例输入】
  5
 12 10 15 20 6

【样例输出】
 0 3 0 0 7

【评测用例规模与约定】
 对于 30% 的数据,1 ≤ N ≤ 1000, 0 ≤  ≤ 1000.
 对于 100% 的数据,1 ≤ N ≤ 100000, 0 ≤ ≤ 100000.

思路与题解:

    输入的刷题数进行排序;
    分情况考虑:奇数情况下,超过中间值才能满足全班刷题比他多的学生数不超过刷题比他少的学生数;偶数情况下需要等于中间偏大的值就可以满足条件。

	public static void Java_B_D() {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int[] nums = new int[n];
		int[] count = new int[n];
		for (int i = 0; i < nums.length; i++) {
			// 输入的一个数组,并把这个数组复制下来
			nums[i] = scan.nextInt();
			count[i] = nums[i];
		}
		// 个数组排一下序方便找到较中间的那个数
		Arrays.sort(count);
		// 找到中间的索引
		int index = 0;
		// 分情况讨论值
		if (n % 2 == 0) {
			index = n / 2 + 1;
		} else {
			index = n / 2;
		}
		// 找到中间值
		int middle = count[index];
		for (int i = 0; i < n; i++) {
			// 判断得到最终结果
			if (nums[i] < middle) {
				System.out.print(middle - nums[i] + 1);
				System.out.print(" ");
			} else {
				System.out.print(0);
				System.out.print(" ");
			}
		}
	}

试题 E: 求阶乘

时间限制: 1.0s 内存限制: 512.0MB
本题总分:15 分
【问题描述】
满足 N! 的末尾恰好有 K 个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 −1。
【输入格式】
 一个整数 K。
【输出格式】
 一个整数代表答案。
【样例输入】
 2
【样例输出】
 10
【评测用例规模与约定】
 对于 30% 的数据,1 ≤ K ≤ .
 对于 100% 的数据,1 ≤ K ≤ .
 

 思路与题解:

    本题要解决两个问题,1.整型数长度越界 2.直接遍历搜索的时间复杂度很大,不可能实现 
    所以要对判断条件作预处理,避免以上两个问题:
         如果末尾存在'0'就是要凑10,而只有2和5两个因数才能得到10,又因为阶乘中2的个数远远大于5,所以要凑5,
         注意对于25,125等数字其中包含不止一个5,所以不能直接输出5K,当k为5时,25的阶乘末尾有6个0,暴力求解: 后面以0结尾的一定是5!....(5的倍数的阶乘) 所以只需要判断5的倍数的阶乘 (判断的数)/5 就是含有5的个数 也是阶乘后0的个数。分析如下:

	public static void Java_B_E() {
		Scanner sc = new Scanner(System.in);
		long k = sc.nextLong();
		long count; // 含有5的个数 也是阶乘后0的个数
		long a = 5; // 直接从5的阶乘(120)开始判断
		while (true) {
			long tempA = a;
			count = 0;
			while (tempA > 0) {
				tempA /= 5;
				count += tempA;
			}

			if (count < k) {
				a += 5;
			} else if (count == k) {
				System.out.println(a);
				break;
			} else {
				System.out.println(-1);
				break;
			}
		}
	}

试题 F: 最大子矩阵

时间限制 : 1.0s
内存限制 : 512.0MB
本题总分: 15
【问题描述】
小明有一个大小为 N × M 的矩阵,可以理解为一个 N M 列的二维数组。
我们定义一个矩阵 m 的稳定度 f ( m ) f ( m ) = max ( m ) min ( m ) ,其中 max ( m )
表示矩阵 m 中的最大值, min ( m ) 表示矩阵 m 中的最小值。现在小明想要从这
个矩阵中找到一个稳定度不大于 limit 的子矩阵,同时他还希望这个子矩阵的面
积越大越好(面积可以理解为矩阵中元素个数)。
子矩阵定义如下:从原矩阵中选择一组连续的行和一组连续的列,这些行
列交点上的元素组成的矩阵即为一个子矩阵。
【输入格式】
第一行输入两个整数 N M ,表示矩阵的大小。
接下来 N 行,每行输入 M 个整数,表示这个矩阵。
最后一行输入一个整数 limit ,表示限制。
【输出格式】
输出一个整数,分别表示小明选择的子矩阵的最大面积。
【样例输入】
3 4
2 0 7 9
0 6 9 7
8 4 6 4
8
【样例输出】
6
【样例说明】
满足稳定度不大于 8 的且面积最大的子矩阵总共有三个,他们的面积都是
6 (粗体表示子矩阵元素):
2 0 7 9
0 6 9 7
8 4 6 4
2 0 7 9
0 6 9 7
8 4 6 4
2 0 7 9
0 6 9 7
8 4 6 4
【评测用例规模与约定】
        评测用例编号                 N                 M
        1, 2                         1 ≤ N ≤ 10         1 ≤ M 10
        3, 4                         N = 1                 M ≤ 100000
        5 ∼ 12                    1 ≤ N ≤ 10         M 10000
        13 ∼ 20                  1 ≤ N ≤ 80         1 ≤ M 80
对于所有评测用例, 0 矩阵元素值 , limit

 思路与题解: 

        时间有限,直接暴力枚举。

    static int[][] arr;

	public static void Java_B_F() {
		Scanner scanner = new Scanner(System.in);
		int N = scanner.nextInt();
		int M = scanner.nextInt();
		arr = new int[N][M];
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				arr[i][j] = scanner.nextInt();
			}
		}
		int limit = scanner.nextInt();
		int max_area = Integer.MIN_VALUE;
		for (int i = N; i > 0; i--) {
			for (int j = M; j > 0; j--) { // i*j的矩阵
				for (int x = 0; x <= N - i; x++) {
					for (int y = 0; y <= M - j; y++) { // 左上角坐标
						int max = find_max(i, j, x, y);
						int min = find_min(i, j, x, y);
						if ((max - min) <= limit) {
							max_area = Math.max(max_area, i * j);
						}
					}
				}
			}
		}
		System.out.println(max_area);
	}

	private static int find_min(int i, int j, int x, int y) {
		// 寻找最小值
		int res = Integer.MAX_VALUE;
		for (int n = x; n < x + i; n++) {
			for (int m = y; m < y + j; m++) {
				res = Math.min(res, arr[n][m]);
			}
		}
		return res;
	}

	private static int find_max(int i, int j, int x, int y) {
		// 寻找最大值
		int res = Integer.MIN_VALUE;
		for (int n = x; n < x + i; n++) {
			for (int m = y; m < y + j; m++) {
				res = Math.max(res, arr[n][m]);
			}
		}
		return res;
	}

以上是A~F前6道题的真题解析,真题解析及内容排版不容易,如果对各位有帮助的话,那就快赞起来吧,感谢关注、收藏、一键三连!

下一篇文章链接:2022年第十三届蓝桥杯Java B组(第二部分 G~J题)

有关2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第一部分】的更多相关文章

  1. arrays - 字符串数组中字符串第一部分的总和 - 2

    我有一个字符串数组,我需要从中提取第一个单词,将它们转换为整数并获得它们的总和。示例:["5Apple","5Orange","15Grapes"]预期输出=>25我的尝试:["5","5","15"].map(&:to_i).sum 最佳答案 我从你的问题中找到了答案。["5Apple","5Orange","15Grapes"].map(&:to_i).sum在数组中,如果存在任何整数可转换值,那么它将自动转换为整数。 关于arrays-字符串数组中字符串第一部分的总和,我们在Sta

  2. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  3. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  4. 蓝桥杯备赛(二) - 2

    目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言:  在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC  已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析  这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy

  5. ruby-on-rails - 如果没有可用标签,则运行标记规范或全部 - 2

    我将guard与rspec和cucumber一起使用。要连续运行选定的规范,我只需使用focus标记来确定我要处理的内容。但问题是,如果没有带有该标签的规范,我想运行所有规范。我该怎么做?注意::我知道所有RSpec选项。因此,请仅在阅读问题后回复。 最佳答案 我通过以下配置实现了您描述的行为:#torunonlyspecificspecs,add:focustothespec#describe"foo",:focusdo#OR#it"shouldfoo",:focusdoconfig.treat_symbols_as_metada

  6. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  7. IDEA 2022 创建 Spring Boot 项目详解 - 2

    如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1.  创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1.  创建SpringBoot项目        打开IDEA,选择NewProject创建项目。        填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。        选择springboot版本以及需要的包,此处只选择了springweb。        此处需特别注意,若你使用的是jdk1

  8. ruby - digest/hmac 是 ruby​​ 标准库的一部分 - 2

    我正在处理一些具有以下内容的代码:beginrequire'digest/hmac'USE_EMBEDDED_HMAC=falserescueputs"HMAC,notfoundinstandardlib."+$!.messagerequire'hmac-sha1'USE_EMBEDDED_HMAC=trueend如我所见,至少在rails1.8.6中它不是标准库的一部分。它是ruby​​1.9lib的一部分吗?如果没有,我应该安装任何gem吗?请注意,使用OpenSSL的解决方案不会被接受,因为它无论如何都会在“要求‘摘要/hmac’”中失败有问题的代码在这里http://githu

  9. 十四届蓝桥青少组模拟赛Python-20221108 - 2

    十四届蓝桥青少组模拟赛Python-20221108T1.二进制位数十进制整数2在十进制中是1位数,在二进制中对应10,是2位数。十进制整数22在十进制中是2位数,在二进制中对应10110,是5位数。请问十进制整数2022在二进制中是几位数?print(len(bin(2022))-2)#运行结果:11T2.晨跑小蓝每周六、周日都晨跑,每月的1、11、21、31日也晨跑。其它时间不晨跑。已知2022年1月1日是周六,请问小蓝整个2022年晨跑多少天?#样例代码1ls=[0,31,28,31,30,31,30,31,31,30,31,30,31]ans=0k=6foriinrange(1,13)

  10. 2022年10月23日周赛ZZULIOJ - 2

    文章目录问题B:芝华士威士忌和他的小猫咪们代码&注释问题C:愿我的弹雨能熄灭你们的痛苦代码注释问题D:猜糖果游戏代码注释问题E:有趣的次方代码注释问题F:这是一个简单题代码&注释问题G:打印矩阵代码注释问题H:scz的简单考验代码注释问题I:完美区间代码&注释问题J:是狂热的小迷妹一枚吖~代码&注释2022年10月23日周赛ZZULIOJ问题B:芝华士威士忌和他的小猫咪们时间限制:1Sec内存限制:128MB题目描述芝华士威士忌很喜欢带着他的猫咪们一块跑着玩。但是小猫咪们很懒,只有在离他y米以内才愿意和他一块跑。这天他在坐标为x的位置,他想和他的猫咪们一块跑着玩。有n个小猫咪,第i个小猫咪在坐

随机推荐