试题 A: 组队 难度(**)
本题总分:5 分
【问题描述】
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。 每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
题解:
- 找最大值
- 每个成员只能出现在某个位置(不能重复)
- 暴力求解
package test;
import java.util.Scanner;
public class A {
public static void main(String[] args) {
// 测试样例
// 97 90 0 0 0 92 85 96 0 0 0 0 0 0 93 0 0 0 80 86 89 83 97 0 0 82 86 0 0 0 0 0
// 0 87 90 0 97 96 0 0 0 0 89 0 0 95 99 0 0 0 0 0 96 97 0 0 0 0 93 98 94 91 0 0
// 0 0 83 87 0 0 0 0 98 97 98 0 0 0 93 86 98 83 99 98 81 93 87 92 96 98 0 0 0 89
// 92 0 99 96 95 81
Scanner scanner = new Scanner(System.in);
int[][] team = new int[20][5];
for(int i = 0; i < 20; i++) {
for(int j = 0; j<5; j++) {
team[i][j] = scanner.nextInt();
}
}
//定义最大值TMax
int TMax = 0;
int temp = 0; //初始化过程最大值
for(int i = 0; i < 20; i++)
for(int j = 0; j < 20; j++)
for(int k = 0; k < 20; k++)
for(int l = 0; l < 20; l++)
for(int h = 0; h < 20; h++) {
if((i != j && i != k && i != l && i!= h) && (j != k && j != l && j != h) && (k != l && k != h) && l != h) {
temp = team[i][0] + team[j][1] + team[k][2] + team[l][3] + team[h][4];
if(temp > TMax) {
TMax = temp;
}
}
}
System.out.println(TMax);
scanner.close();
}
}
试题B:不同子串 难度(**)
思路:看到不同子串,可以采用Java字符串分割,然后用集合的方式来判断是否重复,并且不重复添加进去,最后可以统计集合大小,从而算出正确答案。
package test;
import java.util.HashSet;
import java.util.Set;
public class B {
public static void main(String[] args) {
// TODO Auto-generated method stub
String target = "0100110001010001";
//主要实现:进行添加校验,出现重复的不添加,最后看集合的大小
Set<String> sub = new HashSet<>();
//step相当于确定初始字符串的长度
for(int step = 0; step < target.length(); step++) {
for(int beginIndex = 0, endIndex = 1 + step; endIndex <= target.length(); beginIndex++, endIndex++) {
sub.add(target.substring(beginIndex, endIndex));
}
}
System.out.println(sub.size());
}
}
结果:100
试题C:数列求和 难度(**)
思路:这题算是斐波那契数列的衍生版本,从两数之和到三数之和,如果按照一直相加的情况,就算是BigInteger也存不了那么大的数据,然后就是这题的关键,题目只要求我们给出后四位,这样的话,我们就可以在运算的过程中每次只取后四位进行相加,其他舍弃,刚开始可能会有人觉得疑惑不解,下面我们用直观的方式去证明,其他舍弃跟没有舍弃是没有区别的。
eg:假如这个时候我们只要求后两位数字,正常运行的结果是:
1 1 1 3 5 9 17 37 57 111 205 373 689
然后我们用下面的算法:
运行的结果是:
1 1 1 3 5 9 17 37 57 11 05 73 89
上面加粗的部分,刚好对应正常运行时候的四个数字,他们的后两位完全一样,这就证实了我们的假设是正确的
package test;
public class C {
public static void main(String[] args) {
int[] a = new int[20190324];
a[0] = a[1] = a[2] = 1;
for(int i = 3; i < 20190324; i++) {
//因为题目要求的是后面四位,所以只跟后面四位有关,在运算的过程中就可以不断的进行取余
a[i] = (a[i - 3] + a[i - 2] + a[i - 1]) % 10000;
}
System.out.println(a[20190323]);
}
}
正确答案:4659
试题D:数的分解 难度(***)
思路:(1)分解为三个数(2)三个不相同的正整数。所以划分的思路是这样的:用indexOf确定是否包含的关系,为什么要除3呢,因为A<B、C三个数的排列可能位置是ABC、ACB、CAB可能这三种重复的情况,所以需要除3
package test;
public class D {
public static void main(String[] args) {
int n = 2019;
int num = 0;
//切记从1开始,因为题目要求分解为正整数
for(int i = 1; i < n; i++) {
if((i + "").indexOf("2") != -1 || (i + "").indexOf("4") != -1) {
continue;
}
for(int j = i + 1; j < n; j++) {
if((j + "").indexOf("2") != -1 || (j + "").indexOf("4") != -1) {
continue;
}
int k = n - i - j;
if(k == j || k == i) {
continue;
}
if(k > 0 && (k + "").indexOf("2") == -1 && (k + "").indexOf("4") == -1) {
num++;
}
}
}
System.out.println(num/3);
}
}
正确答案:40785
试题F:特别数的和 难度(*)
题解:我们只需要一次for循环,把每个含有2、0、1、9的数找出来,相加即可
package test;
import java.util.Scanner;
public class F {
public static Boolean check(int i) {
if((i + "").indexOf("2") != -1 || (i + "").indexOf("0") != -1 || (i + "").indexOf("1") != -1 || (i + "").indexOf("9") != -1) {
return true;
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int sum = 0;
for(int i = 1; i <= n; i++) {
if(check(i)) {
sum += i;
}
}
System.out.println(sum);
}
}