第十三届蓝桥杯大赛软件赛省赛 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+" "); } } } }