B:寻找2020
【问题描述】
小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。
小蓝只关注三种构成 2020 的方式:
• 同一行里面连续四个字符从左到右构成 2020。
• 同一列里面连续四个字符从上到下构成 2020。
• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。
例如,对于下面的矩阵:
220000
000000
002202
000000
000022
002020
一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个是斜线上的。
小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。
请帮助小蓝确定在他的矩阵中有多少个 2020。
这里的文件是一个300 × 300的矩阵,大家可以自己创建一个这样的文件,用除2和0外的数字组成这个矩阵,然后在同一行、同一列、统一斜线上创建一个或多个2022进行测试。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] arr = new int[300][300];
for (int i = 0; i < 300; i++) {
String s = sc.next();
for (int j = 0; j < s.length(); j++) {
arr[i][j] = s.charAt(j) - '0';// - ‘0’是因为charAt取值是字符,加减另一个字符本质就是ASCLL码值的加减,运算结果是int型整数并且就是被减数的值,而这里arr数组需要的也是int型整数,正好=赋值就可。
}
}
// 判断同一行
int sum = 0;
for (int i = 0; i < 300; i++) {
for (int j = 0; j < 300; j++) {
if (i + 3 < 300 && arr[i][j] == 2 && arr[i + 1][j] == 0 && arr[i + 2][j] == 2 && arr[i + 3][j] == 0) {
sum++;
}
}
}
// 判断同一列
for (int i = 0; i < 300; i++) {
for (int j = 0; j < 300; j++) {
if (j + 3 < 300 && arr[i][j] == 2 && arr[i][j + 1] == 0 && arr[i][j + 2] == 2 && arr[i][j + 3] == 0) {
sum++;
}
}
}
// 判断同一斜线
for (int i = 0; i < 300; i++) {
for (int j = 0; j < 300; j++) {
if (i + 3 < 300 && j + 3 < 300 && arr[i][j] == 2 && arr[i + 1][j + 1] == 0 && arr[i + 2][j + 2] == 2
&& arr[i + 3][j + 3] == 0) {
sum++;
}
}
}
System.out.println(sum);
}
}
D:七段码
问题描述:
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。
例如:b 发光,其他二极管不发光可以用来表达一种字符。
例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。
例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
猪脑过载,不多bb,我甜蜜直接暴力画图。。。
可以看出,还是很容易漏掉一些情况的,这种方法属于是下下策,慎用!对于这种情况可以先利用数学知识进行全排列分析,如果结果很大,还是老老实实敲代码求解吧。
F:成绩分析
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 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 class Main {
public static void main(String[] args) {
int sNum;
int max;
int min;
float average;
Scanner sc = new Scanner(System.in);
sNum = sc.nextInt();
int[] arr = new int[sNum];
for(int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
Arrays.sort(arr);
System.out.println(arr[sNum - 1]);
System.out.println(arr[0]);
float sum = 0;
for(int i = 0; i < arr.length; i++) {
sum += arr[i];
}
average = sum / sNum;
System.out.println(String.format("%.2f", average));
}
}
G:单词分析
【问题描述】
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。
【输入格式】
输入一行包含一个单词,单词只由小写英文字母组成。
【输出格式】
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
【样例输入】
lanqiao
【样例输出】
a
2
【样例输入】
longlonglongistoolong
【样例输出】
o
6
【评测用例规模与约定】
对于所有的评测用例,输入的单词长度不超过 1000。
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int[] arr = new int[26];
// Arrays.fill(arr, 10);
char[] brr = s.toCharArray();
for(int i = 0; i < brr.length; i++) {
arr[brr[i] - 'a']++;
}
int max = arr[0];
int j = 0;
for(int i = 1; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
j = i;
}
}
// System.out.println('a');// a
// System.out.println((int)'a');// 97
// System.out.println(j + 'a');// 98
System.out.println((char)(j + 'a'));// b
System.out.println(max);
}
}