第十三届蓝桥杯省赛Java-B组
第一次参加蓝桥杯比赛,准备工作就是学了一点算法知识,刷了一些洛谷上的题,往年蓝桥杯都是五道填空五道程序设计,今年又改了,居然两道填空八道程序设计,这样对于往常一些通过不编程就可以写的填空题似乎不是太友好啊,有几道题之前写过类似的题,做着很顺手,总结下来还是要多刷题,多总结题啊。
1️⃣星期计算
这道题本来我想通过用excal中的日期公式计算,可惜结果太大,只能作罢,编程的方式也不难,用大数计算一下结果,对7求余数,得到的结果原来的星期六即可。
答案:7
package top.plutos;
import java.math.BigDecimal;
public class t1 {
public static void main(String[] args) {
BigDecimal tp = new BigDecimal("20");
tp = tp.pow(22).add(new BigDecimal("6"));
System.out.println(tp);
tp = tp.remainder(new BigDecimal("7"));
System.out.println(tp); //0代表的是周日
}
}
2️⃣山
这道题就相当于回文数的特殊版吧,对于求回文数又加了一个限定的条件,就是要求前段回文单调不减(递增或者相等),后段单调不增,求回文数的方式我知道的有两只中,一种是对当前数进行做除法求余数,这种需要对不同长度的字符进行特判,第二种是用StringBuffer,判断字符反转后是否相等。
答案:63936
package top.plutos;
//51948 8000 43948 少了一种回文相等的情况
//54936 9000 63936
public class t2 {
public static void main(String[] args) {
int count = 0; //1011111011
//2022222022
for(int i=2020;i<=2022222022;i++) {
StringBuffer sb = new StringBuffer();
sb.append(i);
String s = ""+i;
//判断回文和是否单调不减
if(Integer.parseInt(s.substring(0,1))<=Integer.parseInt(s.substring(1,2)) && s.equals(sb.reverse().toString())) {
count++;
}
}
System.out.println(count);
}
}
3️⃣字符统计
处理字符串,首先想到用char来处理,这道题可以利用一个char数组存字符串,在通过每个字符独一无二的ASCII码的特点,用另外一个数组arr统计字符出现的次数,把出现次数最多的字符按照字典顺序输出即。
package top.plutos;
import java.util.Scanner;
public class t3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] ch = sc.nextLine().toCharArray();
int[] arr = new int[128];
for(int i=0;i<ch.length;i++) {
arr[ch[i]]++;
}
int max = 0;
StringBuffer sb = new StringBuffer();
//得出出现最多次数的个数
for(int i=0;i<arr.length;i++) {
if(arr[i]>max) {
max = arr[i];
}
}
//把出现次数最多的字符按照字典顺序组合
for(int i=65;i<128;i++) {
if(arr[i]==max) {
sb.append((char)i);
}
}
System.out.println(sb);
}
}
4️⃣最少刷题数
某同学刷题数为i,要求刷题数大于i的学生人数小于等于刷题数小于i的同学数,先按照刷题数进行排序,这样就可以直接得到每个同学刷题数之间的关系,因为要求的是刷题数大于i的学生人数小于等于刷题数小于i的同学数,那么处于排序后半段的同学不需要处理,只需要处理前半段同学,对于前半段同学,需要让他自身的刷题数大于中间值的刷题数即可,因为是二维数组,就手写了一个冒泡排序,代码如下。
package top.plutos;
import java.util.Scanner;
public class t4 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][2];
//第一列赋值
for(int i=0;i<n;i++) {
arr[i][0] = i;
}
//第二列赋值
for(int i=0;i<n;i++) {
arr[i][1] = sc.nextInt();
}
//按照值从小到大排序
boolean flag =true;
for(int i=0;i<n;i++) {
flag=false;
for(int j=0;j<n-i-1;j++) {
if (arr[j][1]>arr[j+1][1]) {
int tp0 = arr[j][0];
int tp1 = arr[j][1];
arr[j][0]=arr[j+1][0];
arr[j][1]=arr[j+1][1];
arr[j+1][0]=tp0;
arr[j+1][1]=tp1;
flag=true;
}
}
}
int[] res = new int[n]; //保存每个同学需要再刷题的结果
//遍历刷题数量
int tp = n/2;
for(int i=0;i<tp;i++) { //只需要遍历前半段
int num = arr[tp][1]-arr[i][1]+1; //求出该同学需要再刷多少题
res[arr[i][0]] = num;
}
for(int i=0;i<n;i++) {
System.out.print(res[i]+" ");
}
}
}
待更新