2020 第十一届届蓝桥杯 Java 大学 B记录个人笔记
- 1 门牌制作
- 2 寻找2020
- 3 蛇形填数
- 4 七段码
- 5 排序
- 6 成绩分析
- 7 单词分析
- 8 数字三角形
- 9 子串分值和
- 10 装饰珠
1 门牌制作
/** * * @author Tmac1 * 小兰想为一条街的居民制作门牌号。 这条街一共有 2020 住户,门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作门牌 0 到 9 这些数字据需要将这些数字字符粘贴在门牌上,如门牌 1017 要依次粘贴字符 1、0、1、7,即需要 1 个 字符 0,2 个字符 1,1 个字符 7。 制作一切 1 到 2020 号门牌需要多少个字符? 2? 【答案提交】 这是一个填空结果的问题,你只需要结果并提交。这个问题的结果是一个整数,在提交答案时只填写整数,填写多余的内容将无法得分。 */ public class q1 {
public static void main(String[] args) {
int sum=0; for (int i = 1; i <=2020; i ) {
String string="" i; sum =check(string); } System.out.println(sum); } private static int check(String string) {
int count=0; for (int i = 0; i <string.length(); i ) {
if (string.charAt(i)=='2') {
count ; } } return count; } }
2 寻找2020
import java.util.Scanner; /** * * @author Tmac1 *小蓝有一个数字
矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。 小蓝只关注三种构成 2020 的方式: • 同一行里面连续四个字符从左到右构成 2020。 • 同一列里面连续四个字符从上到下构成 2020。 • 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。 例如,对于下面的矩阵: 220000 000000 002202 000000 000022 002020 一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个是斜线上的。 小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。 请帮助小蓝确定在他的矩阵中有多少个 2020。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 */ public class q2 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); int[][] num = new int[301][301]; for (int i=1;i<=300;i++) { String str = sc.next(); for (int j=1;j<=str.length();j++) { num[i][j] = str.charAt(j-1) - '0'; } } int ans = 0; //列存在2020 for (int i=1;i<=300;i++) { for (int j=1;j<=300;j++) { if (i+3<=300 && num[i][j]==2 && num[i+1][j]==0 && num[i+2][j]==2 && num[i+3][j]==0) ans++; } } //行存在2020 for (int i=1;i<=300;i++) { for (int j=1;j<=300;j++) { if (j+3<=300 && num[i][j]==2 && num[i][j+1]==0 && num[i][j+2]==2 && num[i][j+3]==0) ans++; } } //斜线存在2020 for (int i=1;i<=300;i++) { for (int j=1;j<=300;j++) { if (i+3<=300 && j+3<=300 && 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); } }
3 蛇形填数
/** * * @author Tmac1 *如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 7 15 ... 3 5 8 14 ... 4 9 13 ... 10 12 ... (1) 11 ... ... 容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少? 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。 */
public class q3 {
public static void main(String[] args) {
int a = 1;int m=0;
for (int i = 0; i <20; i++) {
a += (i * 4);
System.out.println(a);
}
}
}
4 七段码
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。
小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符的表达时,要求所有发光的二极管是连成一片的。
例如: b 发光,其他二极管不发光可以用来表达一种字符。
例如: c 发光,其他二极管不发光可以用来表达一种字符。这种 方案与上 一行的方案可以用来表示不同的字符,尽管看上去比较相似。
例如: a, b, c, d, e 发光, f, g 不发光可以用来表达一种字符。
例如: b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。
请问,小蓝可以用七段码数码管表达多少种不同的字符?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
5 排序
模拟发现105 这里多了5次 将第6位移到第1位验证 答案: jonmlkihgfedcba 小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。
在冒泡排序中,每次只能交换相邻的两个元素。
小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。
例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。
小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。
请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个只包含小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。
/** * * @author Tmac1 *蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。 小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。 小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。 请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个只包含小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。 */
public class q5 {
//排序
public static void main(String[] args) {
String s="";
for(int i=0;i<20;++i){
s=(char)(i+'a')+s;
int cnt=count(s);
System.out.println((i+1)+" "+s+" "+cnt);
}
s="jonmlkihgfedcba";
int cnt=count(s); // 验证
System.out.println(s+" "+cnt);
}
private static int count(String s) {
char []c=s.toCharArray();
int n=c.length,cnt=0;
for(int i=0;i<n-1;++i){
// 冒泡排序
for(int j=0;j<n-i-1;++j){
if(c[j]>c[j+1]){
char t=c[j];
c[j]=c[j+1];
c[j+1]=t;
cnt++;
}
}
}
return cnt;
}
}
6 成绩分析
送分题
import java.util.Arrays;
import java.util.Scanner;
/** * * @author Tmac1 *小蓝给学生们组织了一场考试,卷面总分为 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 q6 {
public static void main(String[] args) {
Scanner kb=new Scanner(System.in);
int n=kb.nextInt();
int a[]=new int [n];
double sum=0;
for (int i = 0; i < a.length; i++) {
a[i]=kb.nextInt();
sum+=a[i];
}
Arrays.sort(a);
System.out.println(a[n-1]);
System.out.println(a[0]);
System.out.println(String.format("%.2f", sum/n));
}
}
7 单词分析
import java.util.Scanner;
/** * * @author Tmac1 问题描述 * 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。 * * 现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。 * * 输入格式 输入一行包含一个单词,单词只由小写英文字母组成。 * * 输出格式 输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。 * * 第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。 * * 样例输入 lanqiao * * 样例输出 a 2 * * 样例输入 longlonglongistoolong * * 样例输出 o 6 * * 评测用例规模与约定 对于所有的评测用例,输入的单词长度不超过 。 */
public class q7 {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
char [] ch = kb.next().toCharArray();
char a[]=new char [26];
for (int i = 0; i <ch.length ; i++) {
a[ch[i]-'a']++;
}
int max=0;
char value=0;
for (int i = 0; i < a.length; i++) {
if (a[i]>max) {
max=a[i];
value=(char) ((char)'a'+i);
}
}
System.out.println(value);
System.out.println(max);
}
}
8 数字三角形
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入格式 输入的第一行包含一个整数 ,表示三角形的行数。下面的 行给出数字三角形。数字三角形上的数都是 至 之间的整数。
输出格式 输出一个整数,表示答案。
样例输入 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 样例输出 27
这道题其实是洛谷P1216的模板 可以去看看 只是多了条件要求向下路径的方式差不能大于1 其实就是最后落在的地方不同
import java.util.Scanner;
public class p1216 {
public static void main(String[] args) {
Scanner kb=new Scanner(System.in);
int n=kb.nextInt();
int dp[][]=new int [n+1][n+1];
for (int i = 1; i <=n; i++) {
for (int j = 1; j <=i; j++) {
dp[i][j]=kb.nextInt();
}
}
for (int i = 1;i<=n; i++) {
for (int j = 1; j <=i; j++) {
dp[i][j]+=Math.max(dp[i-1][j], dp[i-1][j-1]);
}
}
//要向左和向右的次数不能大于1 所以如果是奇数行 一定落在中间位置 偶数行落在(n/2)+1 或者(n/2)-1
if (n%2==0) {
System.out.println(Math.max(dp[n][n/2], dp[n][n/2+1]));
}else {
System.out.println(dp[n][n/2+1]);
}
}
}
9 子串分值和
还没看懂 后面看 问题描述 对于一个字符串 ,我们定义 的分值 为 中出现的不同的字符个数。例如 “aba”,“abc”, “aaa”。
现在给定一个字符串 (长度为 ),请你计算对于所有 的非空子串 ,的和是多少。
输入格式 输入一行包含一个由小写字母组成的字符串 。
输出格式 输出一个整数表示答案。
样例输入 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
import java.util.Scanner;
public class Test {
static char[] ch;
static int[][] vis;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ch = sc.nextLine().toCharArray();
vis = new int[26][ch.length];
vis[ch[0]-'a'][0] = 1;
for(int i=1; i<ch.length; ++i) {
for(int j=0; j<26; ++j)
vis[j][i] = vis[j][i-1];
vis[ch[i]-'a'][i] = i+1;
}
long res = 0;
for(int i=0; i<ch.length; ++i)
for(int j=0; j<26; ++j)
res += vis[j][i];
System.out.println(res);
}
}
10 装饰珠
不会 后面看