🍺1.A的个数
以下是一个 25 行 25 列的字母矩阵,全部由字母 A 和 B 组成。
AAAAAAABABBAABABABAAAAAAA
ABBBBBABBAABBBBBABABBBBBA
ABAAABABBBABAABBBBABAAABA
ABAAABABBBBBAABAABABAAABA
ABAAABABBABABBABABABAAABA
ABBBBBABBBABAABBBBABBBBBA
AAAAAAABABABABABABAAAAAAA
BBBBBBBBABAABABBBBBBBBBBB
AABAABABBAAABBAAABABBBBBA
ABBABABBBABBAAAABBBBAAAAB
BBBBAAABABAABABAABBBAABBA
BBAABABABAAAABBBAABBAAAAA
ABABBBABAABAABABABABBBBBA
AAAABBBBBABBBBAAABBBABBAB
AABAABAAABAAABAABABABAAAA
ABBBBBBBBABABBBBABAABBABA
ABBBAAABAAABBBAAAAAAABAAB
BBBBBBBBABBAAABAABBBABBAB
AAAAAAABBAAABBBBABABAABBA
ABBBBBABBAABABAAABBBABBAA
ABAAABABABBBAAAAAAAAAABAA
ABAAABABABABBBABBAABBABAA
ABAAABABBABBABABAABAABAAA
ABBBBBABABBBBBABBAAAABAAA
AAAAAAABAABBBAABABABBABBA
请问在这个矩阵中有多少个字母A?
第一题打卡题,非常让人舒服的题目,不过做了和没做对自己都没啥帮助哈哈哈。
代码转换:
public class Main4 { public static void main(String[] args) { String a="AAAAAAABABBAABABABAAAAAAA\r\n" + " ABBBBBABBAABBBBBABABBBBBA\r\n" + " ABAAABABBBABAABBBBABAAABA\r\n" + " ABAAABABBBBBAABAABABAAABA\r\n" + " ABAAABABBABABBABABABAAABA\r\n" + " ABBBBBABBBABAABBBBABBBBBA\r\n" + " AAAAAAABABABABABABAAAAAAA\r\n" + " BBBBBBBBABAABABBBBBBBBBBB\r\n" + " AABAABABBAAABBAAABABBBBBA\r\n" + " ABBABABBBABBAAAABBBBAAAAB\r\n" + " BBBBAAABABAABABAABBBAABBA\r\n" + " BBAABABABAAAABBBAABBAAAAA\r\n" + " ABABBBABAABAABABABABBBBBA\r\n" + " AAAABBBBBABBBBAAABBBABBAB\r\n" + " AABAABAAABAAABAABABABAAAA\r\n" + " ABBBBBBBBABABBBBABAABBABA\r\n" + " ABBBAAABAAABBBAAAAAAABAAB\r\n" + " BBBBBBBBABBAAABAABBBABBAB\r\n" + " AAAAAAABBAAABBBBABABAABBA\r\n" + " ABBBBBABBAABABAAABBBABBAA\r\n" + " ABAAABABABBBAAAAAAAAAABAA\r\n" + " ABAAABABABABBBABBAABBABAA\r\n" + " ABAAABABBABBABABAABAABAAA\r\n" + " ABBBBBABABBBBBABBAAAABAAA\r\n" + " AAAAAAABAABBBAABABABBABBA"; char[] s=a.toCharArray(); int ans=0; for(int i=0;i<s.length;++i) { if(s[i]=='A') ans++; } System.out.println(ans);//318 } }
🍻 2.最2数字
如果一个整数的某个数位包含 2 ,则称这个数为一个“最2数字”。例如:102、2021 都是最2数字。
请问在 1(含) 到 2021(含) 中,有多少个最2数字。
不知道为啥蓝桥杯这几年和数字2杠上了,经常出这种和2有关的题目,不过难度一般都是非常友好的,对于大家来说只要细心一点都不会错,也是属于签到的题目。
代码转换:
public class Main2 { public static void main(String[] args) { int ans=0; for(int i=1;i<=2021;++i) { if(check(i)) ans++; } System.out.println(ans);//564 } static boolean check(int n) { while(n!=0) { if(n%10==2) return true; n/=10; } return false; } }
🍸3.最少次数
有一个整数 A=2021,每一次,可以将这个数加 1 、减 1 或除以 2,其中除以 2 必须在数是偶数的时候才允许。
例如,2021 经过一次操作可以变成 2020、2022。
再如,2022 经过一次操作可以变成 2021、2023 或 1011。
请问,2021 最少经过多少次操作可以变成 1。
非常非常经典的题目,力扣上甚至有许多类似的题目,大家有兴趣可以去搜索一下,具体的题目名字我也忘记了。这里由于求的是最少的操作,具有最短路的性质,所以我用的是BFS来搜索。当然这道题的做法有非常多,但我觉得这类题通用BFS模板既不容易出错也能写的更快,何乐而不为呢?
为什么想到用BFS呢?因为对于每个数只有+1,-1,/2的操作。而我们平时图论中搜索是可以上下左右,第一次走到的地方一定是最短路径,而我们这里同理,每个数有+1,-1,/2的三种走法(当然奇数只有前两种),每次我们得到一个新数时,一定是通过最少的操作次数得到它。(如果你学过BFS就能明白,没学过肯定不懂,所以还是先掌握好BFS,当然这题也有其他的做法)
public class Main3 { public static void main(String[] args) { //数组开个10000完全够用了 boolean[] visit=new boolean[10000]; Queue<Integer> queue=new LinkedList<>(); queue.offer(2021); visit[2021]=true; //记录答案 int time=0; //BFS模板走起 while(!queue.isEmpty()) { int size=queue.size(); while(size-->0) { int curr=queue.poll(); //判断curr如果是1则直接输出time就是我们的答案 if(curr==1) { System.out.println(time);//14 return; } if(!visit[curr+1]) { visit[curr+1]=true; queue.offer(curr+1); } if(!visit[curr-1]) { visit[curr-1]=true; queue.offer(curr-1); } //一定要记住,只有偶数才可以选择除以2的操作 if(curr%2==0&&!visit[curr/2]) { visit[curr/2]=true; queue.offer(curr/2); } } time++; } } }
🍹4.超大玉螺旋丸
对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
例如,一个 4 行 5 列的螺旋矩阵如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
请问,一个 30 行 30 列的螺旋矩阵,第 20 行第 20 列的值是多少?
这个题名有点中二了哈哈哈哈哈哈哈,原谅看到这个题目一下想到鸣人。这道题还是有点意思的,有点蓝桥特色。而且这题目在力扣中是有类似的原题的(某个小伙伴告诉我的,非常感谢),直接打印出这个矩阵,然后输出答案即可。问题是如何打印呢?这里我用的是卡神题解中的模板打印,这里我不过多讲解,因为力扣评论区有非常多的大佬详解,这里也附上类似力扣类似原题链接:螺旋矩阵||
本来想用Excel拉出这个表格,但发现一旦左拉或者上拉就会递减,确实不会。如果有会的小伙伴也可以评论区或者私信教我一下,非常感谢😂
代码转换:
public class Main4 { public static void main(String[] args) { int[][] arr=generateMatrix(30); //注意第二十行二十列的下标应该是19,19 System.out.println(arr[19][19]);//819 } //返回的二维数组就是打印好的数组 public static int[][] generateMatrix(int n) { int l = 0, r = n - 1, t = 0, b = n - 1; int[][] mat = new int[n][n]; int num = 1, tar = n * n; while(num <= tar){ for(int i = l; i <= r; i++) mat[t][i] = num++; // left to right. t++; for(int i = t; i <= b; i++) mat[i][r] = num++; // top to bottom. r--; for(int i = r; i >= l; i--) mat[b][i] = num++; // right to left. b--; for(int i = b; i >= t; i--) mat[i][l] = num++; // bottom to top. l++; } return mat; } }