22年java_b组题目解析
写该博客既是为了分享题目解法,也是对之前写的题复习,毕竟已经24年了,写22年的题解
233🤭
文章目录
- 22年java_b组题目解析
- A.星期计算(填空题)
- B.山(填空题)
- C.字符统计(编程题)
- D.最小刷题数
- E.求阶乘
A.星期计算(填空题)
【问题描述】
已知今天是星期六,请问 20 的22次方天后是星期几?
注意用数字 1 到 7 表示星期一到星期日
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【解题思路】
看题目,数字并不是非常大,20的22次方,直接使用大数就能放下,或者可以直接使用电脑自带的计算器计算(
嘿嘿嘿,我当时就用自带计算器做的,并不会被点名~😁),相对于23年的第一题,并不需要太多思考的地方;
【题解】
public class Main {public static void main(String[] args) {BigInteger bigInteger=BigInteger.valueOf(20).pow(22).mod(BigInteger.valueOf(7));// 先定义大数为20的20次方取模7的值;int result=(6+bigInteger.intValue())%7; // 结果值为第一步的取模值+6再取7的模;System.out.println(result==0?7:result);//返回结果,若=0怎刚好整除,返回7,其余返回源值;}
}
方法2,使用计算器计算;
不再截图;
【结果】
7
B.山(填空题)
【问题描述】
这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如 123565321 、 145541 ,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间[2022,2022222022]中有多少个数的形状像一座“山”。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
【解题思路】
看这道题暴力的时间复杂度还是挺高的,但由于是填空题,对于时间复杂度和空间复杂度并没有太大的要求,而且题目目标明确,仍可以暴力解决🤗。
提出一种实现办法:先判断范围内所有的回文数,再判断这些回文数前半部分是否非单调减就ok了
【题解】
public class 山 {public static void main(String[] args) {//2022到2022222022中有多少山;//可以分两步走,先判断所有的回文数,再判断回文数是否单调赠再减;int count=0;a: for (int i = 2022; i <=2022222022; i++) {String s=String.valueOf(i);for (int j = 0; j <(s.length()+1)/2 ; j++) {if(s.charAt(j) != s.charAt(s.length()-1-j))//判断是否是回文数{continue a;}//既然已经是回文数了,只用判断前半部分是否非单调减就行了;}for (int j = 0; j <(s.length()+1)/2-1 ; j++) {if(s.charAt(j)>s.charAt(j+1))continue a;}count=count+1;}System.out.println(count);}
}
注意:由于复杂度较高,程序可能运行几十秒才出结果,不要直接就退出了;
【结果】
3138
C.字符统计(编程题)
【问题描述】
给定一个只包含大写字母的字符串S,请你输出其中出现次数最多的字母。如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母。
【输入格式】
一个只包含大写字母的字符串S.
【输出格式】
若干个大写字母,代表答案。
【样例输入】
BABBACAC
【样例输出】
AB
【解题思路】
其实还是一道复述题,题目并不是很难懂,仍然注重于具体实现,常见思路:🤔
可以先建立长度26的数组,统计出每个字母出现的次数,以字母ascii-A为数组下标,统计出现次数,遍历数组找出最大值,再次遍历数组,比较每个值和最大值大小,等于最大值输出,小于的不管;
【题解】
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String s = scanner.next();// 映射起来还是很容易的,只有大写字母,可以将字母写成26长度的数组统计次数;// A ascii 是 65; Z ascii 是65+26=91;int[] n = new int[26];for (int i = 0; i < s.length(); i++) { // 统计各个字母的出现次数;if (Character.isUpperCase(s.charAt(i))) { // 只考虑大写字母n[s.charAt(i) - 'A']++;}}int maxCount = 0;for (int i = 0; i < n.length; i++) { // 找出出现次数最多的字母的次数maxCount = Math.max(maxCount, n[i]);}// 输出出现次数最多的字母for (int i = 0; i < n.length; i++) {if (n[i] == maxCount) {System.out.print((char) ('A' + i));}}}
}
D.最小刷题数
【问题描述】
小蓝老师教的编程课有N名学生,编号依次是 1…N。第i号学生这学期 刷题的数量是Ai。
对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。
【输入格式】
第一行包含一个正整数N 第二行包含N个整数:A1,A2,A3,…AN.
【输出格式】
输出N个整数,依次表示第 1…N号学生分别至少还要再刷多少道题。
【样例输入】
5 12 10 15 20 6
【样例输出】
0 3 0 0 7
【解题思路】
如果不考虑全部情况,这道题是拿不到满分的,因为中间值可能连续出现很多个,先说基本思路,先对所有初始值排序,并找到中间值是多少,然后从中间值两边遍历,统计出中间值左侧不等于中间值的数多,还是右侧不等于中间值的数多,然后对原数组遍历,根据和中间值的关系使用不同的方案;
【题解】
package 蓝桥杯真题;import java.util.*;public class 最少刷题数 {public static void main(String[] args) {/*** 第一行包含一个正整数 N。* 第二行包含 N 个整数:A1, A2, A3, . . . , AN.*/Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int[] arr = new int[n];for (int i = 0; i < n; i++) {arr[i] = scanner.nextInt();}//对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题//比他多的学生数不超过刷题比他少的学生数。int[] copyarr = Arrays.copyOfRange(arr, 0, arr.length);//将新的复制数组进行排序Arrays.sort(copyarr);int median = copyarr[copyarr.length/2];int result[] = new int[arr.length];int lage = 0;//是否加1的控制开关 默认不加int bigger = 0;int smaller = 0;int mid = 0;//找出比中间值大的数有多少 比中间值小的数有多少for (int i = 0; i < arr.length; i++) {if(copyarr[i]>median) {bigger++;}else if(copyarr[i]<median) {smaller++;}}if(bigger>=smaller) {lage = 1;}if(bigger>smaller) {mid=1;}for (int i = 0; i < result.length; i++) {if(arr[i]< median) {result[i] = median+lage - arr[i];}else if(arr[i]==median&&mid==1) {result[i] = median+mid-arr[i];}else{result[i] = 0;}}for (int i = 0; i < result.length; i++) {System.out.print(result[i]+" ");}}
}
E.求阶乘
【问题描述】
满足N!的末尾恰好有K个 0 的最小的N是多少? 如果这样的N不存在输出-1 。
【输入格式】
一个整数K。
【输出格式】
一个整数代表答案。
【样例输入】
2
【样例输出】
10
【解题思路】
其实如果以前了解这方面的知识那么这道题会比较简单;即,末尾0应该是最小单位2*5组成的,又2很容易很多,只用查询有多少个5就行了,再看题目k范围比较大就不能暴力查找了,用二分查找会好很多,因为整个的阶乘是已经自然排好的;😀
【题解】
import java.util.Scanner;public class Main {// 计算阶乘末尾0的个数其实就是计算阶乘因子中5的个数static long countZeros(long x) {long res = 0;while (x != 0) {res += x / 5;x /= 5;}return res;}
public static void main(String[] args) {// 二分查找Scanner scanner = new Scanner(System.in);long k = scanner.nextLong();long left = 0;long right = Long.MAX_VALUE;//范围左为0,右为边界while (left <= right) {long mid = left + (right - left) / 2;if (k <= countZeros(mid)) {right = mid - 1;} else {left = mid + 1;}}if (countZeros(left) != k) {System.out.print(-1);} else {System.out.print(left);}}
}