当前位置:   article > 正文

蓝桥杯JavaB组真题解析A~E

蓝桥杯javab组真题解析

目录

A.星期计算

B.山

C.字符统计

D.最少刷题数

E.求阶乘


 

A.星期计算

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

 

已知今天是星期六,请问 20^{22} 天后是星期几?

注意用数字 11 到 77 表示星期一到星期日。

 

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

题目分析:

因为20^22次方实在太大,long也存放不下,所以采用边相乘边取模的方式运算

代码:

  1. public class Test01 {
  2. public static void main(String[] args) {
  3. int day = 6;
  4. int res = 1;
  5. for (int i = 0; i < 22; i++) {
  6. res = 20*res %7;
  7. }
  8. res += day;
  9. if(res > 7){
  10. res -= 7;
  11. }
  12. System.out.println(res);
  13. }
  14. }

所以最终的答案为7

B.山

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

 

这天小明正在学数数。

他突然发现有些止整数的形状像一挫 “山”, 比㓚 123565321 、 145541123565321、145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增

小朋数了衣久也没有数完, 他惒让你告诉他在区间 [2022, 2022222022][2022,2022222022] 中有 多少个数的形状像一座 “山”。

 

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

题目分析:因为此题是填空题,所以就采用最原始的办法,暴力求解,注意题目中的两个要求,

1.此数是回文数 2.此数先单调不减,后单调不增 ,可以转成字符串来计算相对简单一点

代码:

  1. public class Test02 {
  2. public static void main(String[] args) {
  3. //count用来计数
  4. int count = 0;
  5. //循环遍历所有数字
  6. for (int i = 2022; i < 2022222022; i++) {
  7. if(palindrome(i) && increasing(i)){
  8. count++;
  9. }
  10. }
  11. System.out.println(count);
  12. }
  13. //判断单调的方法
  14. public static boolean increasing(int num){
  15. //转成字符串类型
  16. String str = String.valueOf(num);
  17. //只需判断前半部分单调不减即可
  18. for (int i = 0; i < (str.length()-1)/2; i++) {
  19. if(str.charAt(i) > str.charAt(i+1)){
  20. return false;
  21. }
  22. }
  23. return true;
  24. }
  25. //判断回文的方法
  26. public static boolean palindrome(int num){
  27. //转成字符串类型
  28. String str = String.valueOf(num);
  29. //判断左右两边是否对称
  30. for (int i = 0; i < str.length()/2; i++) {
  31. if(str.charAt(i) != str.charAt(str.length()-i-1)){
  32. return false;
  33. }
  34. }
  35. return true;
  36. }
  37. }

答案为:3138

C.字符统计

问题描述

 

给定一个只包含大写字母的字符串 SS, 请你输出其中出现次数最多的字符。

如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。

 

输入格式

一个只包含大写字母的字符串 SS.

输出格式

若干个大写字母,代表答案。

样例输入

BABBACAC

 

样例输出

AB

 

评测用例规模与约定

对于 100% 的评测用例, 1≤∣S∣≤10^6.

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

题目分析:

此题需要输出出现最多的字符,创建一个新数组对字符串内的字符进行计数,遍历第一遍找到最大值,遍历第二遍按顺序输出最大值对应的字符

代码:

  1. import java.util.Scanner;
  2. public class Test03 {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. String str = sc.next();
  6. int [] arr = new int[26];
  7. for (int i = 0; i < str.length(); i++) {
  8. int num = str.charAt(i) - 65;
  9. arr[num]++;
  10. }
  11. int max = 0;
  12. for (int i = 0; i < arr.length; i++) {
  13. if(arr[i] > max){
  14. max = arr[i];
  15. }
  16. }
  17. for (int i = 0; i < arr.length; i++) {
  18. if(arr[i] == max) {
  19. System.out.print((char)(i+65));
  20. }
  21. }
  22. }
  23. }

D.最少刷题数

问题描述

小蓝老师教的编程课有 N 名学生, 编号依次是 1 …N 。第 i 号学生这学期 刷题的数量是 Ai​ 。

对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。

输入格式

第一行包含一个正整数 N 。

第二行包含 N 个整数: A1​,A2​,A3​,…,AN​.

输出格式

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

样例输入

  1. 5
  2. 12 10 15 20 6

 

样例输出

0 3 0 0 7

 

评测用例规模与约定

对于 30 \%30% 的数据, 1≤N≤1000,0≤Ai​≤1000.

对于 100 \%100% 的数据, 1≤N≤100000,0≤Ai​≤100000.

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

题目分析:首先我们需要找到这N位同学刷题数的中位数,如果是奇数位同学则正好在正中间,如果是偶数位同学,则找中间偏大的数值,将其赋值给media,然后我们将比media大的值和比media小的值分别进行统计big和small,在此需要进行判断,如果big>= small,则做题比中值小的同学最终做题数必须再+1才符合题目要求,如果big>small时,做题数目和中值相等的需要多做一道题方可符合题目要求。对数组内的值进行一一判断后输出相应的结果。

代码:

  1. import java.util.Arrays;
  2. import java.util.Scanner;
  3. public class Main {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. int n = sc.nextInt();
  7. //创建一个新数组存放数据
  8. int [] nums = new int[n];
  9. for (int i = 0; i < n; i++) {
  10. nums[i] = sc.nextInt();
  11. }
  12. //复制该数组对其排序找到中值
  13. int [] numsCopy = Arrays.copyOf(nums,n);
  14. Arrays.sort(numsCopy);
  15. int media = numsCopy[n/2];
  16. //对比中值大和小的值进行计数
  17. int big = 0;
  18. int small= 0;
  19. for (int i = 0; i < n; i++) {
  20. if(nums[i] > media){
  21. big++;
  22. }else if(nums[i] < media){
  23. small++;
  24. }
  25. }
  26. //判断big和small的大小
  27. //特殊情况加1,默认不加
  28. int flag = 0;
  29. if(big >= small){
  30. flag = 1;
  31. }
  32. int mid = 0;
  33. if(big> small){
  34. mid = 1;
  35. }
  36. for (int i = 0; i < n; i++) {
  37. if(nums[i] < media){
  38. System.out.print(media-nums[i]+flag+" ");
  39. }else if(nums[i] == media) {
  40. System.out.print(mid+" ");
  41. }else {
  42. System.out.print(0+" ");
  43. }
  44. }
  45. }
  46. }

E.求阶乘

问题描述

满足 N! 的末尾恰好有 K 个 0 的最小的 N 是多少?

如果这样的 N 不存在输出 −1 。

输入格式

一个整数 K 。

输出格式

一个整数代表答案。

样例输入

2

 

样例输出

10

 

评测用例规模与约定

对于 30% 的数据, 1≤K≤10e6.

对于 100% 的数据,1≤K≤10e18.

运行限制

  • 最大运行时间:3s
  • 最大运行内存: 512M

题目分析:

末尾有0需要2和5相乘而得到,而2这个因子远远多于5,所以我们只需要计算5这个因子的个数即可得知阶乘末尾0的个数,例如5有一个,10有一个,25则有两个,125则有三个

已知数据范围的情况下,是用二分法快速锁定答案,若存在则输出最小值,否则输出-1即可

代码:

  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner sc = new Scanner(System.in);
  5. long n = sc.nextLong();
  6. //用二分法找到符合要求的最小值
  7. long left = 1;
  8. long right = (long) 9e18;
  9. //写一个判断某个数的阶乘的零的个数的方法
  10. //判断循环条件
  11. long mid = 0;
  12. while(left < right){
  13. mid = (right+left)/2;
  14. if(sumOfZero(mid) >= n){
  15. right = mid;
  16. }else {
  17. left = mid+1;
  18. }
  19. }
  20. if(sumOfZero(left) == n){
  21. System.out.println(left);
  22. }else {
  23. System.out.println(-1);
  24. }
  25. }
  26. //判断某个数的阶乘的零的个数的方法
  27. public static long sumOfZero(long num){
  28. long sum = 0;
  29. while(num > 0){
  30. sum += num/5;
  31. num /= 5;
  32. }
  33. return sum;
  34. }
  35. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/455815
推荐阅读
相关标签
  

闽ICP备14008679号