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

目录

A.星期计算

B.山

C.字符统计

D.最少刷题数

E.求阶乘


 

A.星期计算

问题描述

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

 

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

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

 

运行限制

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

题目分析:

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

代码:

public class Test01 {
    public static void main(String[] args) {
        int day = 6;
        int res = 1;
        for (int i = 0; i < 22; i++) {
            res = 20*res %7;
        }
        res += day;
        if(res > 7){
            res -= 7;
        }
        System.out.println(res);
    }
}

所以最终的答案为7

B.山

问题描述

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

 

这天小明正在学数数。

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

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

 

运行限制

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

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

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

代码:

public class Test02 {
    public static void main(String[] args) {
        //count用来计数
        int count = 0;
        //循环遍历所有数字
        for (int i = 2022; i < 2022222022; i++) {
            if(palindrome(i) && increasing(i)){
                count++;
            }
        }
        System.out.println(count);
    }

    //判断单调的方法
    public static boolean increasing(int num){
        //转成字符串类型
        String str = String.valueOf(num);
        //只需判断前半部分单调不减即可
        for (int i = 0; i < (str.length()-1)/2; i++) {
            if(str.charAt(i) > str.charAt(i+1)){
                return false;
            }
        }
        return true;
    }

    //判断回文的方法
    public static boolean palindrome(int num){
        //转成字符串类型
        String str = String.valueOf(num);
        //判断左右两边是否对称
        for (int i = 0; i < str.length()/2; i++) {
            if(str.charAt(i) != str.charAt(str.length()-i-1)){
                return false;
            }
        }
        return true;
    }
}

答案为:3138

C.字符统计

问题描述

 

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

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

 

输入格式

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

输出格式

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

样例输入

BABBACAC

 

样例输出

AB

 

评测用例规模与约定

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

运行限制

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

题目分析:

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

代码:

import java.util.Scanner;                                 
                                                          
public class Test03 {                                     
    public static void main(String[] args) {              
        Scanner sc = new Scanner(System.in);              
        String str = sc.next();                           
        int [] arr = new int[26];                         
        for (int i = 0; i < str.length(); i++) {          
            int num = str.charAt(i) - 65;                 
            arr[num]++;                                   
        }                                                 
        int max = 0;                                      
        for (int i = 0; i < arr.length; i++) {            
             if(arr[i] > max){                            
                 max = arr[i];                            
             }                                            
        }                                                 
        for (int i = 0; i < arr.length; i++) {            
            if(arr[i] == max) {                           
                 System.out.print((char)(i+65));          
            }                                             
        }                                                 
    }                                                     
}                                                         

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

 

评测用例规模与约定

对于 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时,做题数目和中值相等的需要多做一道题方可符合题目要求。对数组内的值进行一一判断后输出相应的结果。

代码:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        //创建一个新数组存放数据
        int [] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        //复制该数组对其排序找到中值
        int [] numsCopy = Arrays.copyOf(nums,n);
        Arrays.sort(numsCopy);
        int media = numsCopy[n/2];
        //对比中值大和小的值进行计数
        int big = 0;
        int small= 0;
        for (int i = 0; i < n; i++) {
            if(nums[i] > media){
                big++;
            }else if(nums[i] < media){
                small++;
            }
        }
        //判断big和small的大小
        //特殊情况加1,默认不加
        int flag = 0;
        if(big >= small){
            flag = 1;
        }
        int mid = 0;
        if(big> small){
            mid = 1;
        }
        for (int i = 0; i < n; i++) {
            if(nums[i] < media){
                System.out.print(media-nums[i]+flag+" ");
            }else if(nums[i] == media) {
                System.out.print(mid+" ");
            }else {
                System.out.print(0+" ");
            }
        }
    }
}

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即可

代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        //用二分法找到符合要求的最小值
        long left = 1;
        long right = (long) 9e18;
        //写一个判断某个数的阶乘的零的个数的方法
        //判断循环条件
        long mid = 0;
        while(left < right){
            mid = (right+left)/2;
            if(sumOfZero(mid) >= n){
                right = mid;
            }else {
                left = mid+1;
            }
        }
        if(sumOfZero(left) == n){
            System.out.println(left);
        }else {
            System.out.println(-1);
        }
    }

    //判断某个数的阶乘的零的个数的方法
    public static long sumOfZero(long num){
        long sum = 0;
        while(num > 0){
            sum += num/5;
            num /= 5;
        }
        return sum;
    }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值