0
点赞
收藏
分享

微信扫一扫

第十三届蓝桥杯省赛Java B组 A-E

前端王祖蓝 2022-04-13 阅读 25
java算法

昨天刚考完蓝桥杯,现在将几道题解析奉上。

A题:
试题A
送分题,简单的离谱,用Java的BigInteger很轻松算出来。取模7就能知道星期几,模1星期日,模2星期一、以此类推。此题答案为6。

import java.math.BigInteger;

public class Main{
	public static void main(String[] args) {
		long a = (long) Math.pow(20,22);
		System.out.println(a % 7);//答案6
	}
}

B题:

试题B
本题主要考察回文代码,也很简单,因为是填空题,不要考虑复杂度,暴力解就行。答案是3138。

//3138
//回文,且数字先单调不减法,后单调不增 区间[2022,2022222022]
public class Main {
	public static void main(String[] args) {
		int result = 0;
		for (int i = 2022; i <=2022222022; i++) {
			if(check(i)) result++;
		}
		System.out.println(result);
	}
	public static boolean check(int i) {
		String a = String.valueOf(i);
		for (int j = 0; j < a.length()/2; j++) {//例11211,1221
			if(a.charAt(j) != a.charAt(a.length()-j-1)) {
				return false;
			}
		}
		for (int j = 1; j<(a.length()+1)/2; j++) {//如果前一半单调不减,对称的后一半一定单调不增
			if(a.charAt(j) < a.charAt(j-1)) {
				return false;
			}
		}
		return true;
	}
}

C题:
试题C

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String S  =sc.next();
		Map<String, Integer> map = new TreeMap<>();//TreeMap能排序
		String[] arr  = S.split("");
		StringBuffer sb = new StringBuffer();//输出
		int max = 0;
		
		for (int i = 0; i < arr.length; i++) {
			if (!map.containsKey(arr[i])) {
				map.put(arr[i], 1);
			}
			else {
				map.put(arr[i], map.get(arr[i])+1);
			}			
		}
		for(String akey:map.keySet()) {//找到出现最多的次数
			int count = map.get(akey);
			max = Math.max(max, count);
		}
		for(String akey:map.keySet()) {//将出现最多次数的字母保存在sb中
			if (map.get(akey) == max) {
				sb.append(akey);
			}
		}
		System.out.println(sb.toString());
	}
}

D题:
试题D

这题其实很简单(可惜我在考场想复杂了,耗了太多时间(心痛。。。)),只要求出所有学生的中位数即可,然后遍历数组,如果大于等于中位数,输出零,如果小于,输出两数之差加一。

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[] arr = new int[N];
		for(int i =0;i<N;i++) arr[i] = sc.nextInt();
		int[] arr_old = new int[N];
		for (int i = 0; i < N; i++) {
			arr_old[i] = arr[i];
		}
		Arrays.sort(arr);//排序
		
		int mid = arr[(N+1)/2 -1];
		for (int i = 0; i < N; i++) {
			if (arr_old[i] >= mid) {
				System.out.print(0 + " ");
			}
			else if (arr_old[i] < mid) {
				System.out.print(mid - arr_old[i] +1 + " ");
			}		
		}
	}
}

E题:
试题E

我们知道,末尾的0是由5和偶数相乘得到的,一个数的阶乘中,2的倍数的个数一定远远大于5的倍数的个数,所以我们求最小的N应该从5的倍数找起。这里我们用二分法解决问题,注意区间的范围问题。

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long K  =sc.nextLong();
		long  l = 1;long r = Long.MAX_VALUE-10;
		while (l < r) {//二分答案
			long mid = (l + r) /2;
			if (K <= beishu_5(mid)) {
				r = mid;
			}else {
				l = mid + 1;
			}
		}
		if (K != beishu_5(l)) System.out.println(-1);
		else System.out.println(l);
	}
	public static long beishu_5(long x) {//求有多少个5的倍数
		int result = 0;
		while(x > 0) {
			result += x/5;
			x /= 5;
		}
		return result;
	}
}

举报

相关推荐

0 条评论