昨天刚考完蓝桥杯,现在将几道题解析奉上。
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题:
本题主要考察回文代码,也很简单,因为是填空题,不要考虑复杂度,暴力解就行。答案是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题:
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题:
这题其实很简单(可惜我在考场想复杂了,耗了太多时间(心痛。。。)),只要求出所有学生的中位数即可,然后遍历数组,如果大于等于中位数,输出零,如果小于,输出两数之差加一。
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题:
我们知道,末尾的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;
}
}