蓝桥杯JAVA--真题之路(一)

前言

补一下周末合刊,周末有些事情耽误了,抱歉。感觉今年的雪确实很多,今天我们这里又下雪了,快过年了,大家大概也有些家务在身,加油。

主要内容

我的代码展示将以idea的格式展示题目在代码中的注释中

1

java 复制代码
package com.njx.topic1;

import java.util.Random;

public class Test {
    public static void main(String[] args) {
        //红包问题
        //给你两个整数M和N,M表示红包的总额,N表示红包的个数
        //现在又N个人来抽红包,每个人都是随机的,打印每个人领的红包金额

        //注1:每个人最少1分钱
        //注2:每个人领完红包之后,至少预留1*N分钱
        //注3:最后一个人是拿剩余的总额
        //定义变量表示总额
        int money=20000;//分
        //定义红包个数
        int n=5;
        //判断红包金额是否足够,即没人最少1分钱
        if(money<n)
        {
            System.out.println("红包金额不够");
        }else {
            //循环抽取红包
            Random r=new Random();
            for (int i = 1; i <= n-1; i++) {
                //利用Random随机抽取    1 2 3 4 表示第几人抽取
                //                     4 3 2 1 表示预留的钱
                //money-(n-i):至少给后面的人预留一分钱
                //+1:至少给最后一个人预留一分钱
                int Mymoney=r.nextInt(money-(n-i))+1;

                //总额减去当前红包金额
                money-=Mymoney;

                System.out.println("第"+(i+1)+"个人抢到"+Mymoney+"分钱");

            }
            //最后一人抢到的钱
            System.out.println("最后一个人抢到"+money+"分钱");
        }
    }
}

2

java 复制代码
package com.njx.topic1;

public class Test2 {
    public static void main(String[] args) {
        //中位数
        //给定两个正序数组 arr1和 arr2,请先合并数组,并找出合并之后数组的中位数。
        // 举例:123456789
        //中位数:5
        //123456
        //中位数:
        //(3+4)/ 2

        //定义两个数组
        int arr1[]={1,3,5,7,9};
        int arr2[]={2,4};

        double number=findmedianarray(arr1,arr2);
        System.out.println(number);
    }
    public static double findmedianarray(int[] arr1,int[] arr2)
    {
        //将arr1与arr2合并
        //1.定义一个大数组
        int[] arr=new int [arr1.length+arr2.length];
        //保证正序
        //暴力不管顺序,先放入数据在排序
        //思路简单但是效率低

        //快捷思路一边添加一边排序
        //前提arr1和arr2都是正序的

        //2定义两个变量,充当箭头
        int index1=0;
        int index2=0;

        //遍历
        for (int i = 0; i < arr.length; i++) {
            //若arr1短
            if(index1==arr1.length){
                arr[i]=arr2[index2];
                index2++;
                continue;
            }
            //若arr2短
            if(index2==arr2.length){
                arr[i]=arr[index1];
                index1++;
                continue;
            }
            //判断index1与index2指向的数谁小,添加谁
            if(arr1[index1]<arr2[index2]){
                arr[i]=arr1[index1];
                index1++;
            }else{
                arr[i]=arr2[index2];
                index2++;
            }
        }
        //求中位数
        //判断奇数偶数

        //元素 1 2 3 4 5 6
        //索引 0 1 2 3 4 5
        if (arr.length%2==0){
            int num1=arr[arr.length/2];
            int num2=arr[arr.length/2-1];
            return (num1+num2)/2.0;
        }else{
            int num=arr[arr.length/2];
            return num;
        }
    }
}

3

java 复制代码
package com.njx.topic1;

import java.util.Random;

public class Test3 {
    public static void main(String[] args) {
        //统计个数
        //学校选举学生会主席,有5个候选人
        //全校1000名同学参与投票(每人一票,可以弃权,或者选1-5号)。投票使用Random模拟。0:弃权,1~5:给对应的候选人投票
        //要求1:
        //统计每个候选人的得票数和得票率,找出得票最多的候选人?
        //要求2:
        //统计弃票数和弃票率是多少?

        //1创建长度为6的数组,0索引代表弃权,1~5索引代表1~5号候选人
        int[] arr=new int[6];

        //2循环1000次
        Random r=new Random();
        for (int i = 0; i < 1000; i++) {
            //生成1-5投票数
            int vote=r.nextInt(0,6);
            arr[vote]++;
        }

        //3统计每个候选人得票数和得票率
        for (int i = 1; i < arr.length; i++) {
            System.out.println("第"+i+"个候选人的得票数是"+arr[i]+",得票率是"+(arr[i]*1.0/1000)*100+"%");
        }

        //4找出最多票数
        int max=arr[1];
        for (int i =2; i < arr.length; i++) {
            if(max<arr[i]){
                max=arr[i];
            }
        }
        //5票数最多的候选人
        //可能票数相同
        for (int i= 1; i < arr.length; i++) {
            if(max==arr[i]){
                System.out.println("第"+i+"个候选人票数最多,共计"+arr[i]+"张票");
            }
        }
        //6统计弃票数和弃票率
        System.out.println("弃票数是"+arr[0]+",弃票率是"+arr[0]*1.0/1000*100+"%");
    }
}

4

java 复制代码
package com.njx.topic1;

public class Test4 {
    public static void main(String[] args) {
        //接雨水   难,中大厂考题  动态规划
        //给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水
        //输入: height = [0,1,0,2,1,0,1,3,2,1,2,1]输出:6
        //解释: 下面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, 可以接 6个单位的雨水 (蓝色部分表示雨水)


        //1定义数组
        int[] arr={0,1,0,2,1,0,1,3,2,1,2,1};

        //2从左向右遍历,记录雨水加柱子面积总和
        //2.1定义数组记录从左向右看的数据
        int [] leftMax=new int[arr.length];
        //2.2定义第三方变量temp,记录最高柱子
        int temp=arr[0];
        //2.3从左向右遍历
        for (int i = 0; i < arr.length; i++) {
            if(temp>arr[i]){
                leftMax[i]=temp;
            }else{
                leftMax[i]=arr[i];
                temp=arr[i];
            }
        }
        //3从右向左遍历,记录雨水加柱子面积总和
        int [] rightMax=new int[arr.length];
        temp=arr[arr.length-1];
        for (int i = arr.length-1; i >=0; i--) {
            if(temp>arr[i]){
                rightMax[i]=temp;
            }else{
                rightMax[i]=arr[i];
                temp=arr[i];
            }
        }
        //4取交集
        int[] result=new int[arr.length];

        for(int i=0;i<arr.length;i++){
            if(leftMax[i]< rightMax[i]){
                result[i]=leftMax[i];
            }else{
                result[i]=rightMax[i];
            }
        }
        int sum=0;
        for (int i = 0; i < arr.length; i++) {
            sum+=result[i]-arr[i];
        }
        System.out.println(sum);
    }
}

5

java 复制代码
package com.njx.topic1;

import java.util.Scanner;

import java.util.Random;

public class Test5 {
    public static void main(String[] args) {
        //彩票规则:
        //前区:1~35选5个号码(唯一)后区:1~12选2个号码(唯一)跨区可重复
        //中奖规则:
        //一等奖:5+2
        //二等奖:5+1
        //三等奖:5+0/4+2四等奖:4+1 / 3+ 2
        //五等奖:4+0/ 3+1/ 2+ 2
        //六等奖:3+0/1+2/2+1/0+2

        //1利用Random随机生成彩票号码
        int [] lotteryNumber =createLotterynumber();
        printLotteryNumber(lotteryNumber);

        //2利用scanner模拟购买彩票
        int [] myLotteryNumber=buyLotteryNumber();
        printLotteryNumber(myLotteryNumber);

        //3判断中奖情况
        //判断中几个前区
        //判断中几个后区
        getWinnerNumber(lotteryNumber,myLotteryNumber);

    }

    //判断arr2中数据,在arr1中出现几次
    //arr1真正号码
    //arr2用户购买的彩票

    public static void getWinnerNumber(int[] arr1,int[] arr2)  {
        //判断前区
        int count1 = getCount(arr1, arr2, 0, 4);
        //判断后区
        int count2 = getCount(arr1, arr2, 5, 6);

        //判断中奖情况
        if(count1==5&&count2==2){
            System.out.println("恭喜中奖了,一等奖!");
        }else if(count1==5&&count2==1){
            System.out.println("恭喜中奖了,二等奖!");
        } else if (count1==4&&count2==2||count1==5&&count2==0) {
            System.out.println("恭喜中奖了,三等奖!");
        } else if (count1==4&&count2==1||count1==3&&count2==2) {
            System.out.println("恭喜中奖了,四等奖!");
        } else if (count1 == 3 && count2 == 0 || count1 == 3 && count2 == 1 || count1 ==2 && count2 == 2) {
            System.out.println("恭喜中奖了,五等奖!");
        }else if(count1==3&&count2==0||count1==2&&count2==1||count1==1&&count2==2||count1==0&&count2==2){
            System.out.println("恭喜中奖了,六等奖!");
        }else{
            System.out.println("未中奖!");
        }
    }

    //判断前区或后区中了几个求
    public static int getCount(int[] arr1,int[] arr2,int start,int end){
        int count = 0;

        for (int i = start; i <= end; i++) {
            boolean flag = contains(arr2[i], arr1, 0, 4);
            //如果当前数字已存在,表示中了一个
            if(flag){
                count++;
            }
        }
        //当循环结束就知道中的号码个数
        return count;
    }

    public static int[] buyLotteryNumber() {
        //1创建数组
        int[] arr = new int[7];

        //2利用scanner模拟购买彩票,1-35选五个(唯一)
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 5; ) {
            System.out.println("请输入第" + (i + 1) + "个前区号码(1-35):");
            int number = scanner.nextInt();
            //范围
            if(number<1||number>35){
                System.out.println("输入的号码超出范围,请重新输入:");
                continue;
            }
            //判断是否唯一
            boolean flag = contains(number, arr, 0, 4);
            if(flag){
                System.out.println("该号码已存在,请重新输入:");
                continue;
            }
            //如果代码能运行到这里,说明输入的号码是合法的
            arr[i]=number;
            i++;
        }
        
        //3输入后区号码(1-12选两个唯一)
        for (int i = 5; i < 7; ) {
            System.out.println("请输入第" + (i - 4) + "个后区号码(1-12):");
            int number = scanner.nextInt();
            //范围
            if(number<1||number>12){
                System.out.println("输入的号码超出范围,请重新输入:");
                continue;
            }
            //判断是否唯一
            boolean flag = contains(number, arr, 5, 6);
            if(flag){
                System.out.println("该号码已存在,请重新输入:");
                continue;
            }
            //如果代码能运行到这里,说明输入的号码是合法的
            arr[i]=number;
            i++;
        }
        
        scanner.close();
        return arr;
    }
    
    public static int[] createLotterynumber() {
        //1创建数组
        int[] arr = new int[7];

        //利用Random随机生成前区五个1~35的随机数,并保存在数组中
        Random r = new Random();
        for (int i = 0; i < 5; ) {
            int number = r.nextInt(1,36);
            boolean flag = contains(number, arr, 0, 4);
            if(! flag){
                arr[i] = number;
                i++;
            }
        }

        //利用Random随机生成后区两个1~12的随机数,1-12 并保存在数组中
        for (int i = 0; i < 2; ) {
            int number = r.nextInt(1,13);
            boolean flag = contains(number, arr, 5, 6);
            if(! flag){
                arr[i+5] = number;
                i++;
            }
        }
        return arr;
    }
    public static boolean contains(int number,int[] arr,int start,int end)
    {
        for (int i = start; i <= end; i++) {
            if(arr[i]==number)
            {
                return true;
            }
        }
        return false;
    }

    public static void printLotteryNumber(int[] arr) {
        System.out.println("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                System.out.println(arr[i]);
            } else {
                System.out.print(arr[i] + "、");
            }
        }
        System.out.println("]");
    }


}

6

java 复制代码
package com.njx.topic1;

import java.util.Scanner;

public class Test6 {
    public static void main(String[] args) {
        //X 星球的考古学家发现了一批古代留下来的密码。
        //
        //这些密码是由 A、B、C、D 四种植物的种子串成的序列。
        //
        //仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
        //
        //由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。
        //
        //你的任务是:给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。
        //文章核心:最少删除/插入使字符串成为回文
        //模板
        //1. 计算最长回文子序列 LPS
        //2. 答案 = 字符串长度 - LPS

                Scanner sc = new Scanner(System.in);

                String s = sc.nextLine();
                int n = s.length();

                // dp[i][j] 表示 s[i..j] 的最长回文子序列长度
                int[][] dp = new int[n][n];

                // 1. 初始化:单个字符
                for (int i = 0; i < n; i++) {
                    dp[i][i] = 1;
                }

                // 2. 区间 DP
                // i 从后往前,j 从前往后
                for (int i = n - 1; i >= 0; i--) {
                    for (int j = i + 1; j < n; j++) {
                        if (s.charAt(i) == s.charAt(j)) {
                            dp[i][j] = dp[i + 1][j - 1] + 2;
                        } else {
                            dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                        }
                    }
                }

                // 最长回文子序列长度
                int lps = dp[0][n - 1];

                // 最少脱落(删除)数量
                int result = n - lps;

                System.out.println(result);

                sc.close(); // Scanner 关闭要在 main 里面
            }
        }

最后一语

周末合刊的内容大多来自黑马讲解的内容,题目较难,若又看不懂的可在评论区留言或者看黑马的视频,java+ai系列。

当生命的时针有张有弛,疾徐有致地行走时,我们的日子才会随着日升日落发出流水一样清脆的足音。

------ 迟子建 《也是冬天,也是春天》
感谢观看,共勉!!

相关推荐
寻寻觅觅☆6 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
偷吃的耗子7 小时前
【CNN算法理解】:三、AlexNet 训练模块(附代码)
深度学习·算法·cnn
青云计划7 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿7 小时前
Jsoniter(java版本)使用介绍
java·开发语言
化学在逃硬闯CS7 小时前
Leetcode1382. 将二叉搜索树变平衡
数据结构·算法
ceclar1238 小时前
C++使用format
开发语言·c++·算法
探路者继续奋斗8 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
Gofarlic_OMS8 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
夏鹏今天学习了吗8 小时前
【LeetCode热题100(100/100)】数据流的中位数
算法·leetcode·职场和发展
消失的旧时光-19439 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言