试题 A: 门牌制作(5分)
【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、 0、 1、 7,即需要 1 个
字符 0, 2 个字符 1, 1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案解析
答案是 624。
将int转为char类型,进行判断计数。
public static void main(String[] args) {
String s;
int num=0,result=0;
char c;
for (int i = 1; i <= 2020; i++) {
s=i+"";
num=s.length();
for (int j = 0; j < num; j++) {
if (s.charAt(j)=='2')
result+=1;
}
}
System.out.println(result);
}
试题 B: 寻找 2020(5分)
【问题描述】
小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找
到这个数字矩阵中有多少个 2020 。
小蓝只关注三种构成 2020 的方式:
• 同一行里面连续四个字符从左到右构成 2020。
• 同一列里面连续四个字符从上到下构成 2020。
• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。
例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的, 1 个是在同一列里的, 3 个
是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一
个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。
请帮助小蓝确定在他的矩阵中有多少个 2020。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案解析
答案是 16520。
答案结果是300行300列,按照案例进行验证。按行录入,存入对应的二维数组,分别校验行、列、斜,计数求和。
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int[][] num=new int[6][6];
for (int i = 0; i <6; i++) {
String str=sc.nextLine();
for (int j = 0; j <str.length() ; j++) {
num[i][j]=str.charAt(j);
}
}
int ans=0;
for (int i = 0; i <6 ; i++) {
for (int j =0; j <6 ; j++) {
if (j+3<6&&num[i][j]=='2'&&num[i][j+1]=='0'&&num[i][j+2]=='2'&&num[i][j+3]=='0')
ans++;
}
}
for (int i = 0; i <6 ; i++) {
for (int j =0; j <6 ; j++) {
if (i+3<6&&num[i][j]=='2'&&num[i+1][j]=='0'&&num[i+2][j]=='2'&&num[i+3][j]=='0')
ans++;
}
}
for (int i = 0; i <6 ; i++) {
for (int j =0; j <6 ; j++) {
if (i+3<6&&j+3<6&&num[i][j]=='2'&&num[i+1][j+1]=='0'&&num[i+2][j+2]=='2'&&num[i+3][j+3]=='0')
ans++;
}
}
System.out.println(ans);
}
试题 C: 蛇形填数(10分)
【问题描述】
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列 的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案解析
答案是 761。
第一个数是1,第二个数是5,第三个数是13,第四个数是25。根据规律可得第n个数是nn+(n-1)(n-1),所以第二十个数是2020+1919=761
程序设计题
试题 F: 成绩分析(15分)
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是 一个 0 到 100 的整数。
请计算这次考试的最高分、最低分和平均分。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。 接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出三行。 第一行包含一个整数,表示最高分。 第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
【样例输入】
7
80
92
56
74
88
99
10
【样例输出】
99
10
71.29
【评测用例规模与约定】
对于 50% 的评测用例,1≤n≤100。
对于所有评测用例,1≤n≤10000。
答案解析
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt(),max=0,min=100,temp;
double sum=0.0;
for (int i = 0; i < n; i++) {
sum+=temp=sc.nextInt();
if(temp>max)
max=temp;
else if (temp<min)
min=temp;
}
System.out.printf("%d\n%d\n%.2f",max,min,sum/n);
}
试题 G: 单词分析 (20分)
【问题描述】
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不 住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得 最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
【输入格式】
输入一行包含一个单词,单词只由小写英文字母组成。
【输出格式】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
【样例输入】
lanqiao
【样例输出】
a
2
【样例输入】
longlonglongistoolong
【样例输出】
o
6
【评测用例规模与约定】
对于所有的评测用例,输入的单词长度不超过 1000。
答案解析
利用hashMap去重存入Map,并且记录次数。最后利用Entry便利Map得到次数最多的字母。
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
int num=0;
char c='z';
Map<Character,Integer> hash=new HashMap<>();
for (int i = 0; i < s.length() ;i++) {
if (hash.containsKey(s.charAt(i))){
hash.replace(s.charAt(i),hash.get(s.charAt(i))+1);
}
else hash.put(s.charAt(i),1);
}
for (Map.Entry<Character,Integer> entry:hash.entrySet()){
if (entry.getValue()>num)
num=entry.getValue();
}
for(Map.Entry<Character,Integer> entry:hash.entrySet()){
if (entry.getValue()==num){
if (entry.getKey()<c){
c=entry.getKey();
}
}
}
System.out.printf("%c\n%d",c,num);
}
试题 H: 数字三角形(20分)
【问题描述】
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。 对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最 大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
【输入格式】
输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。
【输出格式】
输出一个整数,表示答案。
【样例输入】
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【样例输出】
27
答案解析
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+1][n+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
arr[i][j]=sc.nextInt();
arr[i][j]+=Math.max(arr[i-1][j-1], arr[i-1][j]);
}
}
System.out.println(n%2==1?arr[n][n/2+1]:Math.max(arr[n][n/2], arr[n][n/2+1]));
}
}
试题 I: 子串分值和(25分)
【问题描述】
对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中出现的不同的字符个 数。例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1。 现在给定一个字符串 S[0…n−1](长度为 n),请你计算对于所有 S 的非空 子串 S[i…j](0≤i≤ j < n),f(S[i…j]) 的和是多少。
【输入格式】
输入一行包含一个由小写字母组成的字符串 S。
【输出格式】
输出一个整数表示答案。
【样例输入】
ababc
【样例输出】
28
【样例说明】
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
【评测用例规模与约定】
对于 20% 的评测用例,1≤n≤10;
对于 40% 的评测用例,1≤n≤100;
对于 50% 的评测用例,1≤n≤1000;
对于 60% 的评测用例,1≤n≤10000;
对于所有评测用例,1≤n≤100000。
答案解析
利用subString截取所有字串的可能性,编写验证子串不同字母个数,然后求和。
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine(),sb;
int sum=0;
for (int i = 0; i < s.length(); i++) {
for (int j = i+1; j <=s.length(); j++) {
sb=s.substring(i,j);
sum+=Num(sb);
}
}
System.out.println(sum);
}
public static int Num(String sa){
Set<Character> set=new HashSet<>();
for (int i = 0; i < sa.length(); i++) {
set.add(sa.charAt(i));
}
return set.size();
}
亲测一千以内的没问题,过50%测试