第十三届蓝桥杯JavaB组省赛部分题解

本文介绍了五道来自GitHub算法代码的题目,包括星期计算、回文数检测、字符计数、最少刷题次数和求阶乘,涉及Java编程技巧和基本算法,适合初学者和进阶者学习。
摘要由CSDN通过智能技术生成

目录

A:星期计算

B:山

C:字符统计

D:最少刷题数

E:求阶乘


 GitHub算法详细代码(多届比赛的多个算法题):yhbn/algorithm (github.com)

懒得打字了,题目直接上图片了,就会前五个,

个人主观感觉这五个加起来也没前几天发布的十四届的那两个题目难

第十四届蓝桥杯JavaB组E题----蜗牛_蓝桥杯蜗牛-CSDN博客

第十四届蓝桥杯JavaB组G题----买二赠一-CSDN博客

A:星期计算

简单题,用Java自带的BigDecim可以直接算,也可以直接用计算器自己算也行,对7取%即可

import java.math.BigInteger;

public class Main {

	public static void main(String[] args) {
		BigInteger bigInteger = BigInteger.valueOf(20).pow(22).mod(BigInteger.valueOf(7));
		int result = (6 + bigInteger.intValue()) % 7;
		System.out.println(result == 0 ? 7 : result);
	}

}

 

B:山

经典的回文数的问题,之前刷洛谷的时候做过,用Java""+数字得到字符串的性质,然后用字符串的reserve方法逆转字符串,与原字符串比较,然后在把字符串转成字符数组,从1开始一直到chars.length/2 比较与前一个数字的大小

package No13_2022;

import org.junit.Test;

/*
这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如 123565321 、 145541 ,它们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间[2022,202222 2022]中有多少个数的形状像一座“山”。
 */
public class test2 {
   @Test
   public void test(){
       int sum=0;
       for (int i = 2022; i <2022222022 ; i++) {
           int temp=i;
           int j=0;
           int B[]=new int[10];
           while (temp!=0){
               B[j]=temp%10;
               temp=temp/10;
               j++;
           }
           int v=0;
           int low=0;
           int high=9;
           while (B[high]==0){
               high--;
           }
           while (low<high){
               if (B[low]!=B[high]){
                   v=1;
               }
               if (B[low]==B[high]){
                   if (low>0){
                       if (B[low]<B[low-1]){
                           v=1;
                       }
                   }
               }
           }
           if (v==0){
               sum++;
           }
       }
       System.out.println(sum);
   }

}

C:字符统计

也是一道经典的题,之前做过一个线性表(顺序表,链表都可以),要保证26个字母一个最多出现一次,要怎么解决?这两个题目的相似之处就是"26个字母"构成的,而不是其他的无穷个元素(比如汉字)构成的,直接桶排序,创建数组桶用来计数,最后便利数组,把找到的最大的下标加上65转为char输出即可

package No13_2022;

import org.junit.Test;

public class test3 {


    void lost(String S){
        Byte a='A';
        byte[] sb = S.getBytes();
        Byte b[]=new Byte[26];
        for (int i = 0; i < 26; i++) {
            b[i]=0;
        }
        for (int i = 0; i < sb.length; i++) {
            b[sb[i]-65]++;
        }
        int max=0;
        for (int i = 0; i < 26; i++) {
            if (b[i]>max) max=b[i];
        }
        for (int i = 0; i < 26; i++) {
            if (b[i]==max) {
                char p= (char) (i+'A');
                System.out.print(p);

            }
        }
    }
    @Test
    public void test(){
        lost("BABBACAC");

    }
}

D:最少刷题数

为什么这道题会出现在这,这也是简单题,利用Arrays.sort给数组排序,找到中点(顺序表可随机访问,找重点时候不用遍历)创建新数组c把中点值和原数组比较,原数组第i个元素大于等于中点值时,c[i]等于0,否则c[i]=mid-a[i]+1

package No13_2022;


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


public class test4 {
    void shauti(){
        Scanner scanner=new Scanner(System.in);
        int N=scanner.nextInt();
        int a[]=new int [N];
        int b[]=new int[N];
        for (int i = 0; i < N; i++) {
           int temp=scanner.nextInt();
            a[i]=temp;
            b[i]=temp;
        }
        Arrays.sort(a);
        int mid=a[N/2];
        //System.out.println(mid);
        int c[]=new int[N];
        for (int i = 0; i < N; i++) {
            if (b[i]>=mid)c[i]=0;
            else c[i] =mid-b[i]+1;
        }
        for (int i = 0; i < N; i++) {
            System.out.print(c[i]);
        }
    }


}

E:求阶乘

先new一个k个0的字符串v,然后写一个求阶乘后K位的函数(注意要保证阶乘值的位数要大于k,把后k位以字符串的形式返回)然后 用v.equals(阶乘函数返回的字符串即可)

package No13_2022;

import java.util.Scanner;

public class test5 {

    //TODO 满足N!的末尾恰好有K个 0 的最小的N是多少?
    //TODO 如果这样的N不存在输出-1
    void number (){
        Scanner scanner = new Scanner(System.in);
        long k=scanner.nextLong();
        String v="";
        long i=0;
        while (i<k){
            v+="0";
            i++;
        }
        i=1;
        while (!v.equals(jiecheng(i,k))){
            i++;
        }
        System.out.println(i);

    }
    String jiecheng(long a,long k){
        long jie=1l;
        while (a>0){
            jie*=a;
            a--;
        }

        char[] chars = ("" + jie).toCharArray();
        String s="";
        if (chars.length>=k){
            for (int i = chars.length-1; i >chars.length-1-k ; i--) {
                s+=chars[i];
            }
        }

        return s;
    }


}

  • 23
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱吃于先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值