【备战蓝桥杯 | 软件Java大学B组】十三届真题深刨详解(1)
个人名片:
🐼作者简介:一名大二在校生,喜欢编程🎋
🐻❄️个人主页🥇:小新爱学习.
🐼个人WeChat:hmmwx53
🕊️系列专栏:🖼️
- 零基础学Java——小白入门必备
- 重识C语言——复习回顾
- 计算机网络体系———深度详讲
- 微信小程序开发——实战开发
🐓每日一句:🍭我很忙,但我要忙的有意义!
文章目录
- 第十三届蓝桥杯大赛软件赛省赛 Java 大学 B 组
- 试题 A: 星期计算
- 试题 B: 山
- 试题 C: 字符统计
- 试题 D: 最少刷题数
- 关注博主不迷路,持续更新中...
- 欢迎添加微信,加入我的核心小队,请备注来意
第十三届蓝桥杯大赛软件赛省赛 Java 大学 B 组
试题包含“结果填空”和“程序设计”两种题型。
结果填空题:要求选手根据题目描述直接填写结果。求解方式不限。不要
求源代码。把结果填空的答案直接通过网页提交即可,不要书写多余的内容。
程序设计题:要求选手设计的程序对于给定的输入能给出正确的输出结果。
考生的程序只有能运行出正确结果才有机会得分
- 注意:不要使用 package 语句。
- 注意:选手代码的主类名必须为:Main,否则会被判为无效代码。
- 注意:如果程序中引用了类库,在提交时必须将 import 语句与程序的其
他部分同时提交。只允许使用 Java 自带的类库。
试题 A: 星期计算
【问题描述】
已知今天是星期六,请问 2022 天后是星期几?
注意用数字 1 到 7 表示星期一到星期日。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题解思路】
答案:7
对于填空题可以直接利用电脑计算机计算20^22,再对此数进行取余,结果为1,然后下一天即就是星期日即为7
代码示例:
public class Main {
public static void main(String[] args) {
double res = Math.pow(20, 22);
res %= 7;
System.out.println(res + 6);
}
}
试题 B: 山
【问题描述】
这天小明正在学数数。
他突然发现有些正整数的形状像一座“山”,比如 123565321、145541,它
们左右对称(回文)且数位上的数字先单调不减,后单调不增。
小明数了很久也没有数完,他想让你告诉他在区间 [2022, 2022222022] 中有
多少个数的形状像一座“山”。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题解思路】
答案:3138
读题可知这是道判断回文题,并且具有单调条件!!!
回文数左右对称,所以只需判断是否回文,然后再判断左边的数单调不减,则右边的数一定单调不增。
package lanqiao;
public class B_山 {
//答案:3138
public static void main(String[] args) {
// TODO Auto-generated method stub
long ans=0;
for(long i=2022;i<=2022222022;i++) {
if(check(i)) {
ans++;
}
}
System.out.println(ans);
}
private static boolean check(long i) {
//判断是否回文
String string = String.valueOf(i);
StringBuilder sBuilder = new StringBuilder(string);
if(string.compareTo(sBuilder.reverse().toString())==0) { //是回文数
for(int j=0;j<string.length()/2;j++) {
int pre = Integer.valueOf(string.charAt(j));
int aft = Integer.valueOf(string.charAt(j+1));
if(aft<pre)
return false;
}
System.out.println(i);
return true;
}
return false;
}
}
试题 C: 字符统计
【问题描述】
给定一个只包含大写字母的字符串 S,请你输出其中出现次数最多的字母。
如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母。
【输入格式】
一个只包含大写字母的字符串 S .
【输出格式】
若干个大写字母,代表答案。
【样例输入】
BABBACAC
【样例输出】
AB
【评测用例规模与约定】
对于 100% 的评测用例,1 ≤ |S | ≤ 106.
【题解思路】
这道题很简单,直接利用HashMap存储每个字母出现的次数,再用TreeSet存储,使其按照字典序排列,最后输出次数最多的字母
/**
*
*/
package lanqiao;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class C_字符统计 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String string = scanner.next();
Map<Character, Integer> map = new HashMap<>();
int ans_count = Integer.MIN_VALUE;
for(int i=0;i<string.length();i++) {
char c = string.charAt(i);
if(map.get(c)==null) {
map.put(c, 1);
}else {
map.put(c, map.get(c)+1);
}
if(map.get(c)>ans_count) {
ans_count=map.get(c);
}
}
Set<Character> ansCharacters = new TreeSet<>();
for(Map.Entry<Character, Integer> entry:map.entrySet()) {
if(entry.getValue()==ans_count) {
ansCharacters.add(entry.getKey());
}
}
for(Character c:ansCharacters) {
System.out.print(c);
}
}
}
思路二:
直接统计输出即可:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int[] arr = new int[26];
for (int i = 0; i < s.length(); i++) {
arr[s.charAt(i) - 'A']++;
}
int max = Integer.MIN_VALUE;
for (int i = 0; i < 26; i++) {
max = Math.max(max, arr[i]);
}
for (int i = 0; i < 26; i++) {
if(arr[i] == max) System.out.print((char) (i+'A'));
}
}
}
试题 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
【评测用例规模与约定】
对于 30% 的数据,1 ≤ N ≤ 1000, 0 ≤ Ai ≤ 1000.
对于 100% 的数据,1 ≤ N ≤ 100000, 0 ≤ Ai ≤ 100000
【题解思路】
用数组接收每个同学刷题数量,然后先对每个学生的刷题数进行从小到大排列,观察发现,需要再刷题的学生只有前半部分学生,需要刷题人数为n/2,而再刷的题目数量为中间同学的刷题量与该同学的刷题量的差值,然后利用左右与中间值相同数量,求出差值即可
package lanqiao;
import java.util.Arrays;
import java.util.Scanner;
public class D_最少刷题数 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int N=scanner.nextInt();
int[] arr = new int[N];
int[] find = new int[N];
for(int i=0;i<N;i++) {
int num = scanner.nextInt();
arr[i]=num;
find[i]=num;
}
Arrays.sort(find);
for(int i=0;i<N;i++) {
//在find中查找arr[i]的位置
int pos = Arrays.binarySearch(find, arr[i]);
//计算其左边的数
int less = pos;
int more = N-pos-1;
if(more>less) { //刷题多的多余刷题少的
int d = more-less;
int num = find[pos+d/2]-find[pos]+1;
System.out.print(num+" ");
}else {
System.out.print(0+" ");
}
}
}
}
关注博主不迷路,持续更新中…
欢迎添加微信,加入我的核心小队,请备注来意
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇