飞道的博客

蓝桥杯备赛(三)

420人阅读  评论(0)

目录

前言:

一、门牌制作

解析:

代码实现

二、寻找2020

解析:

代码实现

三、蛇形填数

解析:

代码实现

四、成绩分析

解析:

 代码实现

五、单词分析

解析:

代码实现

小结:


前言:

    算法的题目需要时间去沉淀。当我们有了一定的刷题量,思路就会开阔很多,年轻人加油吧🤞

一、门牌制作

解析:

     遍历1到2020,求每个数字中间有多少个2,然后累加即可。

代码实现


  
  1. public class Test10 {
  2. public static void main (String[] args) {
  3. int count = 0;
  4. for ( int i = 1; i <= 2020; i++) {
  5. int tmp = i;
  6. while (tmp != 0) {
  7. if (tmp % 10 == 2) {
  8. count++;
  9. }
  10. tmp /= 10;
  11. }
  12. }
  13. System.out.println(count);
  14. }
  15. }

答案:624

二、寻找2020

解析:

    由于这个需要读取文件,这里只有题目,直接谈思路。遍历这个矩阵,分别判断每个数据的行,列,左上到右下的斜线(只判读四个数据)。如果符合要求计数即可。

    注意:我们在判断时,数据不能够越界。所以需要加上先决条件。

代码实现


  
  1. public class Test11 {
  2. public static void main (String[] args) {
  3. int[][] arr = {{ 2, 2, 0, 0, 0, 0},{ 0, 0, 0, 0, 0, 0},{ 0, 0, 2, 2, 0, 2},{ 0, 0, 0, 0, 0, 0},{ 0, 0, 0, 0, 2, 2},{ 0, 0, 2, 0, 2, 0}};
  4. int row = arr.length;
  5. int col = arr[ 0].length;
  6. int count = 0;
  7. for( int i = 0; i < row; i++) {
  8. for( int j = 0; j < col; j++) {
  9. //行
  10. if(j + 3 < col && arr[i][j] == 2 && arr[i][j + 1] == 0 && arr[i][j + 2] == 2 && arr[i][j + 3] == 0) {
  11. count++;
  12. }
  13. //列
  14. if(i + 3 < row && arr[i][j] == 2 && arr[i + 1][j] == 0 && arr[i + 2][j] == 2 && arr[i + 3][j] == 0) {
  15. count++;
  16. }
  17. //对角
  18. if(i + 3 < row && j + 3 < col && arr[i][j] == 2 && arr[i + 1][j + 1] == 0 && arr[i + 2][j + 2] == 2 && arr[i + 3][j + 3] == 0) {
  19. count++;
  20. }
  21. }
  22. }
  23. System.out.println(count);
  24. }
  25. }

三、蛇形填数

解析:

    观察数据可发现,数据是以如下规律连续递增的。

    已经得到数据的增长趋势,接下来只需要观察它们下标的规律,就可以填这些数。

    可以很清楚的观察到。除了第一行,第二行横坐标在增长,纵坐标在减小。第三行横坐标在减小,纵坐标在增加,以此交替出现。减小的坐标直到减小到0,这行才会停止。下面的行减小的坐标是上一行增加的坐标加1,增加的坐标也是从0开始。

    用i和j分别代表横纵坐标,第一行用[i--][j++]特殊处理。处理完成后i不符合第二行开始的坐标,j符合。(每一行开始0是交替出现)修正i,然后判断,开始第二行数据的添加。当第二行添加完成后,i符合第三行的开始坐标,j不符合。这个也是交替出现的。

代码实现(有详细注释)


  
  1. public class Test12 {
  2. public static void main (String[] args) {
  3. //规律:每一行开头不是j为0就是i为0
  4. int[][] arr = new int[ 100][ 100];
  5. int tmp = 1;
  6. int i = 0;
  7. int j = 0;
  8. for( int k = 0; k <= 90; k++) {
  9. if(i == 0 && j == 0) {
  10. arr[i--][j++] = tmp++; //结果j符合,i小1(两者交替出现)
  11. } else if(++i == 0) { //修正i后在判断
  12. int ret = k;
  13. while((ret + 1) != 0) {
  14. arr[i++][j--] = tmp++;
  15. ret--;
  16. }
  17. } else if(++j == 0) { //修正j后再判断
  18. int ret = k;
  19. //上面i会经过判断,需修正
  20. i--;
  21. while((ret + 1) != 0) {
  22. arr[i--][j++] = tmp++;
  23. ret--;
  24. }
  25. }
  26. }
  27. System.out.println(arr[ 19][ 19]);
  28. }
  29. }

答案:761

四、成绩分析

解析:

    这道题比较简单,最后需要格式化输出平均分。

    注意:格式化输出就会进行四舍五入。

代码实现


  
  1. import java.util.Scanner;
  2. public class Test3 {
  3. public static void main (String[] args) {
  4. Scanner scanner = new Scanner(System.in);
  5. int n = scanner.nextInt();
  6. int[] arr = new int[n];
  7. int i = 0;
  8. for(i = 0; i < n; i++) {
  9. arr[i] = scanner.nextInt();
  10. }
  11. int max = arr[ 0];
  12. int min = arr[ 0];
  13. int sum = 0;
  14. for(i = 0; i < n; i++) {
  15. if(arr[i] > max) {
  16. max = arr[i];
  17. }
  18. if(arr[i] < min) {
  19. min = arr[i];
  20. }
  21. sum += arr[i];
  22. }
  23. System.out.println(max);
  24. System.out.println(min);
  25. double tmp = sum * 1.0 / n;
  26. //格式化就是四舍五入
  27. System.out.printf( "%.2f", tmp);
  28. }
  29. }

五、单词分析

解析:

    用一个计数数组,遍历字符串。统计每个字符出现的次数。在统计次数的时候,每个字符是作为下标去统计的,字典序小的字符就会在数组的前面。遍历计数数组,找出出现次数最多的字符即可。

代码实现


  
  1. import java.util.Scanner;
  2. public class Test16 {
  3. public static void main (String[] args) {
  4. Scanner scan = new Scanner(System.in);
  5. String str = scan.nextLine();
  6. int[] arr = new int[ 26];
  7. for( int i = 0; i < str.length(); i++) {
  8. char tmp = str.charAt(i);
  9. arr[tmp - 'a']++;
  10. }
  11. int max = 0;
  12. for( int i = 1; i < arr.length; i++) {
  13. if(arr[i] > arr[max]) {
  14. max = i;
  15. }
  16. }
  17. System.out.println(( char)(max + 'a'));
  18. System.out.print(arr[max]);
  19. scan.close();
  20. }
  21. }

小结:

    在刷题时要多留意一些细节性的问题,善于总结,坚持下去会有不一样的收获。


转载:https://blog.csdn.net/weixin_62353436/article/details/127787952
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场