2019年javaB组蓝桥杯
试题A:组队
题目描述
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
答案:490
试题B.不同的子串:
一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成
的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:100
利用散列表去重,返回set长度
public static void main(String[] args) {
String s="0100110001010001",sa;
Set<String> set=new HashSet<>();
for (int i = 0; i < s.length(); i++) {
for (int j = i+1; j <= s.length(); j++) {
sa=s.substring(i,j);
set.add(sa);
}
}
System.out.println(set.size());
}
试题C:数列求值
题目描述
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写 多余的内容将无法得分。
答案:4659
求最后四位就取模10000,求最后三位就取模1000,不然数据会溢出
public static void main(String[] args) {
int[] a=new int[20190324];
a[1]=a[2]=a[0]=1;
for (int i = 3; i < 20190324; i++) {
a[i]=(a[i-1]+a[i-2]+a[i-3])%10000;
}
System.out.println(a[20190323]);
}
试题D.数的分解:
把2019 分解成3 个各不相同的正整数之和,并且要求每个正整数都不包
含数字2 和4,一共有多少种不同的分解方法?
注意交换3 个整数的顺序被视为同一种方法,例如1000+1001+18 和
1001+1000+18 被视为同一种。
答案:40785
public static void main(String[] args) {
Set<HashSet<Integer>> set=new HashSet<>();
int sum=0;
for (int i = 1; i < 2019; i++) {
for (int j = i+1; j < 2019; j++) {
for (int k = j+1; k <2019 ; k++) {
if ((i+k+j)>2019)
break;
if (i+j+k==2019&&a(i)&&a(j)&&a(k))
sum++;
}
}
}
System.out.println(sum);
}
public static boolean a(int b){
String c=String.valueOf(b);
char ch;
for (int i = 0; i <c.length() ; i++) {
ch=c.charAt(i);
if (ch=='2'||ch=='4')
return false;
}
return true;
}
编程题
试题F.特别数的和:
小明对数位中含有2、0、1、9 的数字很感兴趣(不包括前导0),在1 到
40 中这样的数包括1、2、9、10 至32、39 和40,共28 个,他们的和是574。
请问,在1 到n 中,所有这样的数的和是多少?
输入:
输入一行包含一个整数n。
输出:
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
40
【样例输出】
574
校验然后累加求和
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt(),sum=0;
for (int i = 1; i <= n; i++) {
if (a(i))
sum+=i;
}
System.out.println(sum);
}
public static boolean a(int b){
String c=String.valueOf(b);
char ch;
for (int i = 0; i <c.length() ; i++) {
ch=c.charAt(i);
if (ch=='2'||ch=='0'||ch=='1'||ch=='9')
return true;
}
return false;
}
第I题:后缀表达式
题目描述
给定 N 个加号、M 个减号以及 N + M + 1 个整数 A1,A2,··· ,AN+M+1,小 明想知道在所有由这 N 个加号、M 个减号以及 N + M +1 个整数凑出的合法的后缀表达式中,结果最大的是哪一个?
请你输出这个最大的结果。
例如使用1 2 3 + -,则 “2 3 + 1 -” 这个后缀表达式结果是 4,是最大的。
【输入格式】
第一行包含两个整数 N 和 M。 第二行包含 N + M + 1 个整数 A1,A2,··· ,AN+M+1。
【输出格式】
输出一个整数,代表答案。
【样例输入】
1 1
1 2 3
【样例输出】
4
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int M=sc.nextInt(),sum=0;
int[] a=new int[N+M+1];
for (int i = 0; i < a.length; i++) {
a[i]=sc.nextInt();
}
Arrays.sort(a);
int x=0;
for (int i = a.length-1; i >= 0; i--) {
if (x<N+1)
sum+=a[i];
x++;
if(x>N+1)
sum-=a[i];
}
System.out.println(sum);
}