蓝桥杯备赛(三)

目录

前言:

一、门牌制作

解析:

代码实现

二、寻找2020

解析:

代码实现

三、蛇形填数

解析:

代码实现

四、成绩分析

解析:

 代码实现

五、单词分析

解析:

代码实现

小结:


前言:

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

一、门牌制作

解析:

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

代码实现

public class Test10 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 1; i <= 2020; i++) {
            int tmp = i;
            while (tmp != 0) {
                if (tmp % 10 == 2) {
                    count++;
                }
                tmp /= 10;
            }
        }
        System.out.println(count);
    }
}

答案:624

二、寻找2020

解析:

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

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

代码实现

public class Test11 {
    public static void main(String[] args) {
        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}};
        int row = arr.length;
        int col = arr[0].length;
        int count = 0;
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                //行
                if(j + 3 < col && arr[i][j] == 2 && arr[i][j + 1] == 0 && arr[i][j + 2] == 2 && arr[i][j + 3] == 0) {
                    count++;
                }
                //列
                if(i + 3 < row && arr[i][j] == 2 && arr[i + 1][j] == 0 && arr[i + 2][j] == 2 && arr[i + 3][j] == 0) {
                    count++;
                }
                //对角
                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) {
                    count++;
                }

            }
        }
        System.out.println(count);
    }
}

三、蛇形填数

解析:

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

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

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

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

代码实现(有详细注释)

public class Test12 {
    public static void main(String[] args) {
        //规律:每一行开头不是j为0就是i为0
        int[][] arr = new int[100][100];
        int tmp = 1;
        int i = 0;
        int j = 0;
        for(int k = 0; k <= 90; k++) {
            if(i == 0 && j == 0) {
                arr[i--][j++] = tmp++;//结果j符合,i小1(两者交替出现)
            }else if(++i == 0) {//修正i后在判断
                int ret = k;
                while((ret + 1) != 0) {
                    arr[i++][j--] = tmp++;
                    ret--;
                }
            }else if(++j == 0) {//修正j后再判断
                int ret = k;
                //上面i会经过判断,需修正
                i--;
                while((ret + 1) != 0) {
                    arr[i--][j++] = tmp++;
                    ret--;
                }
            }
        }
        System.out.println(arr[19][19]);
    }
}

答案:761

四、成绩分析

解析:

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

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

代码实现

import java.util.Scanner;
public class Test3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n];
        int i = 0;
        for(i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        int max = arr[0];
        int min = arr[0];
        int sum = 0;
        for(i = 0; i < n; i++) {
            if(arr[i] > max) {
                max = arr[i];
            }
            if(arr[i] < min) {
                min = arr[i];
            }
            sum += arr[i];
        }
        System.out.println(max);
        System.out.println(min);
        double tmp = sum * 1.0 / n;
        //格式化就是四舍五入
        System.out.printf("%.2f", tmp);
    }
}

五、单词分析

解析:

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

代码实现

import java.util.Scanner;
public class Test16 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        int[] arr = new int[26];
        for(int i = 0; i < str.length(); i++) {
            char tmp = str.charAt(i);
            arr[tmp - 'a']++;
        }
        int max = 0;
        for(int i = 1; i < arr.length; i++) {
            if(arr[i] > arr[max]) {
                max = i;
            }
        }
        System.out.println((char)(max + 'a'));
        System.out.print(arr[max]);
        scan.close();
    }
}

小结:

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

  • 38
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小太空人w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值