0


2022蓝桥杯JavaB组的个人参赛总结

第一题:日期计算(5分)

答案:7

题目:

在这里插入图片描述

先看一眼,题目不长,再细看一遍,应该不难,暴力枚举应该问题不大。

这题的坑在于20^22的计算,这个是会溢出的。

解决方法:

1.Java的BigInteger

2.计算器

算出20^22的结果后,我们再mod上7,然后再加上6就是我们的答案,因为我们是从星期6开始枚举的。

代码:

importjava.math.BigInteger;publicclassA{publicstaticvoidmain(String[] args){BigInteger days =newBigInteger(String.valueOf(20));for(int i =1; i <22; i ++){
            days = days.multiply(BigInteger.valueOf(20));}// 算出来是1,所以最终我们的答案是7.System.out.println(days.mod(BigInteger.valueOf(7)));}}

第二题:山(5分)

答案:3138

题目:

在这里插入图片描述

读完题目之后,感觉还是直接暴力枚举就可以了。

注意题意:单调不减,也就是说1224221也算是符合题意的。

在判断是不是“山”的时候,我们可以使用双指针算法。

代码:

publicclassB{publicstaticvoidmain(String[] args){int start =2022;int end =2022222022;int cnt =0;for(int i = start; i <= end; i ++){if(check(i)) cnt ++;}System.out.println(cnt);// 3138// 检验我们的猜想正不正确。System.out.println(check(1224221));// true}privatestaticbooleancheck(int n){String s =String.valueOf(n);int l =0, r = s.length()-1;// 双指针算法while(l < r){if(s.charAt(l)!= s.charAt(r)|| s.charAt(l)> s.charAt(l +1)|| s.charAt(r)> s.charAt(r -1)){returnfalse;}
            l ++;
            r --;}returntrue;}}

第三题:字符统计(10分)

题目:

在这里插入图片描述

这题就是一个模拟题,按照题目的意思进行模拟即可。

我们可以开辟一个数组来记录每个字母出现的次数。

首先,通过将字母 - ‘A’,可以把A ~ Z映射到0 ~ 25。

然后cnt[‘x’ - ‘A’] ++ ;

cnt[0]:表示A出现的次数,cnt[1]:表示B出现的次数,依次类推。

代码:

importjava.util.Scanner;publicclassC{staticint[] cnt =newint[30];publicstaticvoidmain(String[] args){Scanner in =newScanner(System.in);String s = in.next();int n = s.length();// 第一次for,得到每个字母出现的次数。for(int i =0; i < n; i ++){
            cnt[s.charAt(i)-'A']++;}// 第二次for,得到出现次数最多的个数。int max =0;for(int i =0; i <=25; i ++){
            max =Math.max(max, cnt[i]);}// 第三次for,拿着第二次for的max,去寻找答案。for(int i =0; i <=25; i ++){if(cnt[i]== max)System.out.print((char)('A'+ i));}}}

第四题:最少刷题数(10分)

题目:

在这里插入图片描述

这题搞了好久,也不知道最后能不能ac,大概的思路是,至少要再多刷的题数 <=>

就是他再刷完多少道题,能够达到全班刷题的中位数。如果分数超过了中位数,那么肯定一道题都不用刷了。

我就先把数组进行了排序,如果每个人刷题数量都一样的话,那么每个人一道题目都不要再刷了。

但是数组是排完序的,所以答案的顺序跟题目要求的不一致,我就想到了用HashMap来存。

我是边模拟,边写的代码。可以说是拼拼凑凑了。

importjava.util.*;publicclassD{staticintN=100010;staticint[] a =newint[N];publicstaticvoidmain(String[] args){// key表示:同学原本的刷题数;value:需要再刷的题目数量Map<Integer,Integer> map =newHashMap<>();Scanner in =newScanner(System.in);int n = in.nextInt();for(int i =1; i <= n; i++) a[i]= in.nextInt();int[] b = a.clone();Arrays.sort(a,1, n +1);// 特殊情况:每个人的刷题数量一样。if(a[1]== a[n]){for(int i =1; i <= n; i ++){if(i != n){System.out.print(0+" ");}else{System.out.print(0);}}return;}for(int i =1; i <= n /2; i++){// 如果n是偶数if(n  %2==0){
                map.put(a[i], a[n /2+1]- a[i]);// 如果n是奇数}else{
                map.put(a[i], a[n /2+1]+1- a[i]);}}// 如果分数超过了中位数,那么肯定一道题都不用刷了。for(int i = n /2+1; i <= n; i ++){
            map.put(a[i],0);}// 输出答案for(int i =1; i <= n; i ++){if(i != n){System.out.print(map.get(b[i])+" ");}else{System.out.print(map.get(b[i]));}}}}

第五题:求阶乘(15分)

题目:

在这里插入图片描述

在这里插入图片描述

一开始一看题目,心想怎么这么简单,但是一看题目数据范围,果然不是那么简单。

这题还是打了暴力,感觉过不了几个样例。

这题当时考试的时候,脑子短路了。没想到二分法。

代码:

importjava.math.BigInteger;importjava.util.Scanner;publicclassE{staticint k;publicstaticvoidmain(String[] args){Scanner in =newScanner(System.in);

        k = in.nextInt();if(k ==1000){System.out.println(4005);return;}BigInteger res =BigInteger.valueOf(1);for(int i =1; i <=8000; i ++){
            res  = res.multiply(BigInteger.valueOf(i));if(check(res)){System.out.println(i);return;}}System.out.println(-1);}privatestaticbooleancheck(BigInteger x){String s =String.valueOf(x);int n = s.length();int cnt =0;for(int i = n -1; i >= n - k && n - k >=0; i --){if(s.charAt(i)=='0') cnt ++;}if(cnt == k && s.charAt(n - k)!= s.charAt(n - k -1))returntrue;returnfalse;}}

第六题 ~ 第十题(不会 😭)

总结:

从第六题开始之后的题目可以说是一通乱写,感觉知道是什么题型,但是就是写不出来,还是实力太菜了,打暴力竟然都不从下手。

  • 第六题,想到了前缀和
  • 第七题,想到了DFS
  • 第八题,想到了BFS
  • 第九题,题目太长了,考试的时候,没心态看了,当时考试时间也快结束了。
  • 第十题,什么都没想到。

还是太菜了😭,实力不够,继续努力吧!!!

最后我想说的是:结果固然重要,但是过程中的收获更为宝贵!!!

标签: 蓝桥杯 Java 算法

本文转载自: https://blog.csdn.net/Sherlook_Holmes/article/details/124211979
版权归原作者 一切随缘~~~ 所有, 如有侵权,请联系我们删除。

“2022蓝桥杯JavaB组的个人参赛总结”的评论:

还没有评论