蓝桥杯22年javaB组省赛真题

本文介绍了五道Java_b组题目,涵盖填空题(如星期计算和回文数计数)、编程题(字符统计和阶乘计算),展示了如何运用编程技巧解决问题和优化算法。
摘要由CSDN通过智能技术生成

22年java_b组题目解析

写该博客既是为了分享题目解法,也是对之前写的题复习,毕竟已经24年了,写22年的题解

233🤭

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);
    }
  }
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值