蓝桥杯java真题练习学习。

真题练习

大部分程序来自查阅网络资源总结。

1.卡片

package Chapter01;

//卡片
public class Demo01 {
    public static void main(String[] args) {
        int[] num = new int[10];//建一个数组存放0-9的卡片数目。
        int temp,t;
        boolean flag = true;//设置一个标志位。
        for (int i = 0; i < num.length; i++) {
            num[i] = 2021;//一种卡片有2021张。
        }
        for (int i = 1;  ; i++) {
            temp = i;
            while (temp!=0){
                t = temp % 10;//先取最低位。
                if(num[t]<=0){//判断是否此类卡片。
                    flag = false;
                    break;
                }
                num[t]--;
                temp = temp/10;//再取它的倒第二位进行判断。
            }
            if (flag==false){
                System.out.println(i-1);
                break;
            }
        }
    }
}

2.相乘

package Chapter01;

//相乘
public class Demo02 {
    public static void main(String[] args) {
        long x = 0;
        for (long i = 1; i < 1000000007; i++) {
            if ((i*2021)%1000000007==999999999){
                x=i;
                break;
            }
        }
        if (x!=0){
            System.out.println(x);
        }else System.out.println(0);

    }
}

3.最小砝码

package Chapter01;

import java.util.Scanner;

//最小砝码
/*
规律:
weight *= 3;
totalweight +=weight;
 */
public class Demo03 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        scanner.close();

        int weight = 1;//砝码的重量。
        int count = 1;//需要几个砝码。
        int totalweight = 1;//砝码能够称出的总重量。
        while (N>totalweight){
            weight *= 3;
            totalweight +=weight;
            count++;
        }
        System.out.println(count);
    }
}

5.时间显示

package Chapter01;

import java.util.Scanner;

//时间显示
public class Demo04 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long N = scanner.nextLong();
        long s = N/1000%3600%60;//注意是毫秒数,所以要刍议1000。
        long m = N/1000%3600/60;
        long h = N/1000/3600%24;//注意%24。
        //按题目要求输出。
        System.out.print((h>10?h:"0"+h)+":");
        System.out.print((m>10?m:"0"+m)+":");
        System.out.print(s>10?s:"0"+s);
    }
}

6.最小砝码

package Chapter01;

import java.util.Scanner;

//最小砝码
/*
规律:
weight *= 3;
totalweight +=weight;
 */
public class Demo03 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        scanner.close();

        int weight = 1;//砝码的重量。
        int count = 1;//需要几个砝码。
        int totalweight = 1;//砝码能够称出的总重量。
        while (N>totalweight){
            weight *= 3;
            totalweight +=weight;
            count++;
        }
        System.out.println(count);
    }
}

7.跑步训练

package Chapter02;

import java.util.Calendar;

//跑步训练
public class Demo02 {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.set(2000,0,1);//月是从0~11的。
        int year = 0;
        int month = 0;
        int day = 0;
        int week = 0;
        int sum = 0;//跑步千米数。
        while (true){
            if (year==2020 && month==10 && day==1){
                break;
            }
            year = c.get(Calendar.YEAR);
            month = c.get(Calendar.MONTH)+1;
            day = c.get(Calendar.DAY_OF_MONTH);
            week = c.get(Calendar.DAY_OF_WEEK);
            if (week==2||day==1){//week=2是星期一。
                sum +=2;
            }else {
                sum +=1;
            }
            c.add(Calendar.DAY_OF_WEEK,1);//下一天。
        }
        System.out.println(sum);

    }
}

8.平面分割

package Chapter02;

//平面分割
//没看懂。
public class Demo03 {
    public static void main(String[] args) {
        int[][] a = new int[21][21];
        a[0][0] = 1;
        for (int i = 1; i < 21; i++) {
            a[i][0] = a[i - 1][0] + i;
            for (int j = 1; j < 21; j++) {
                a[i][j] = a[i][j - 1] + 2 * i + 2 * (j - 1);
            }
        }
        System.out.println(a[20][20]);
    }
}

9.蛇形填数

package Chapter02;

//蛇形填数
/*
看对角线上的元素,找规律
1   5   13   25。5比1大4,13比5大8······
因此arr[i][i] = arr[i-1][i-1]+i*4;
 */
public class Demo04 {
    public static void main(String[] args) {
        int[][] arr = new int[20][20];
        arr[0][0]=1;
        for (int i = 1; i < 20; i++) {
            arr[i][i] = arr[i-1][i-1]+i*4;
        }
        System.out.println(arr[19][19]);
    }
}

10.排序

package Chapter02;

//排序
public class Demo05 {
    public static void main(String[] args) {
        //思路1:要求字典序最小,那肯定要尽量让字母从a开始挨个出现 —— a,b,c,d.....
        //思路2:冒泡排序中,如果一个数组是完全倒序,则需要的交换的次数最多,尽可能选用完全倒序的数组,可以使字母数尽可能少
        //思路3:完全倒序的数组,用冒泡排序一共要交换 n*(n-1)/2 次 —— (n-1) + (n-2) + ... + 3 + 2 + 1 , 等差数列求和公式
        //思路4:解方程 n*(n-1)/2 = 100, 得 n ~ 14.65 ,所以字母最少为15个
        //思路5: 15个字母从 a 开开始,依次是 a,b,c,d,e,f,g,h,i,j,k,l,m,n,o
        //思路5:但是当 n = 15时,完全倒序的数组需要排105次,显然不符合题目100次的要求,所以要在基础上进行修改
        //思路6: 15个字母完全倒序 —— o,n,m,l,k,j,i,h,g,f,e,d,c,b,a 扣除5次排序,只需将第六个字母 j 移至第一位即可
        //最终结果:j,o,n,m,l,k,i,h,g,f,e,d,c,b,a

        System.out.println("jonmlkihgfedcba");
    }
}

11.成绩统计

package Chapter02;

import java.util.Scanner;

//成绩统计
public class Demo06 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = scanner.nextInt();
        }
        scanner.close();

        int sum01 = 0;
        int sum02 = 0;
        for (int i = 0; i < N; i++) {
            if (arr[i]>=85) {
                sum01++;
            }
        }
        for (int i = 0; i < N; i++) {
            if (arr[i]>=60){
                sum02++;
            }
        }
        System.out.println(String.format("%.0f",((float) sum02/N)*100)+"%");
        System.out.println(String.format("%.0f",((float) sum01/N)*100)+"%");
    }
}

12.回文日期

package Chapter02;

import java.util.Scanner;

//回文日期
public class Demo07 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.close();

        boolean flag = false;
        for (int i = n+1; i<=99991231 ; i++) {
            if (check(i)==false){//检查是否是个日期格式。
                continue;
            }
            //判断是否是回文日期
            if(i/10000000==i%10 && i/1000000%10==i/10%10 && i/100000%10==i/100%10 && i/10000%10==i/1000%10){
                if (flag == false){
                    System.out.println(i);
                    flag = true;
                }
                int A = i/10000000;
                int B = i/1000000%10;
                //判断是否是AB形式的回文日期。
                if (A!=B && i/100000%10==A && i/10000%10==B && i%10==A && i/10%10==B && i/100%10==A && i/1000%10==B){
                    System.out.println(i);
                    break;
                }
            }
        }
    }

    
    //检查是不是一个日期形式。
    private static boolean check(int x) {
        int year = x/10000;
        int month = x/100%100;
        int day = x%100;
        int Date = 31;//一个月中的天数。
        if (month==4 || month==6 || month==9 || month==11){
            Date = 30;
        }else if (month==2){
            if (year%400==0 || (year%4==0 && year%100!=0)){
                Date = 29;
            }else {
                Date = 28;
            }
        }
        boolean flag = true;
        if (month<1 || month>12){
            flag = false;
        }else if (day<1 || day>Date){
            flag = false;
        }
        return flag;
    }
}

13.作物杂交

package Chapter02;

import java.util.Scanner;

//作物杂交
public class Demo08 {
    static int n, m, k, t;
    //种植时间、初始作物种类、这几种方案杂交所需的时间、植物是否已经合成、记录各类物种合成所需的最短时间.
    static int[] time, staSeed, maxTime, visited, res;
    static int[][] hyb;//杂交途径

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //第一行数目
        n = scan.nextInt();//作物种类
        m = scan.nextInt();//初始作物种类
        k = scan.nextInt();//杂交途径
        t = scan.nextInt();//目标种子
        res = new int[n + 1];//记录各类物种合成所需的最短时间
        time = new int[n + 1];//种植时间
        for (int i = 1; i <= n; i++) {
            time[i] = scan.nextInt();
        }
        staSeed = new int[m];//初始作物种类
        maxTime = new int[k];
        visited = new int[n + 1];
        for (int i = 0; i < m; i++) {
            staSeed[i] = scan.nextInt();
            visited[staSeed[i]] = 1;//记录初始作物已合成
        }
        hyb = new int[k][3];
        for (int i = 0; i < k; i++) {
            hyb[i][0] = scan.nextInt();
            hyb[i][1] = scan.nextInt();
            hyb[i][2] = scan.nextInt();
            maxTime[i] = Math.max(time[hyb[i][0]], time[hyb[i][1]]);
        }

        //dfs
        System.out.println(dfs(t));
    }


    public static int dfs(int tar) {
        if (visited[tar] == 0) {//未合成
            int min = Integer.MAX_VALUE;//MAX_VALUE = 2147483647.
            //遍历杂交hyb
            for (int i = 0; i < k; i++) {
                if (hyb[i][2] == tar) {
                    min = Math.min(min, (maxTime[i] + Math.max(dfs(hyb[i][0]), dfs(hyb[i][1]))));
                }
            }
            visited[tar] = 1;
            res[tar] = min;
            return min;
        } else {
            return res[tar];
        }
    }

}

14.字串分值

package Chapter02;

import java.util.Scanner;

//字串分值
//超时了。
public class Demo09 {
    static int num=0;

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
        for(int i=0 ; i<str.length() ; i++){
            for(int k= i+1 ; k<=str.length() ; k++){
                String res = str.substring(i , k);
                s(res);
            }
        }
        System.out.println(num);
    }


    public static void s(String str) {
        int book[]=new int [26];
        int n=0;
        for(int i=0;i<str.length();i++) {
            book[str.charAt(i)-'a']++;
        }
        for(int i=0;i<book.length;i++) {
            if(book[i]==1) num++;
        }
    }

}

15.求和

package Chapter03;

//求和
public class Demo01 {
    public static void main(String[] args) {
        int sum = 0;
        String str = "";
        for (int i = 1; i <= 2019; i++) {
            str = ""+i;
            //判断字符串中是否包含2,0,1,9。
            if (str.contains("2") || str.contains("0") ||str.contains("1") ||str.contains("9")){
                sum += i;
            }
        }
        System.out.println(sum);
    }
}

16.年号字串

package Chapter03;

//年号字串
public class Demo02 {
    public static void main(String[] args) {
        char x = 2019%26+64;
        char y = 2019/26%26+64;
        char z = 2019/26/26+64;
        System.out.println(""+z+y+x);
    }
}

17.质数

package Chapter03;

//质数
public class Demo03 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 2;  ; i++) {
            if (check(i)){
                count++;
            }
            if (count==2019){
                System.out.println(i);
                System.exit(0);
            }
        }
    }

    //判断是否为质数。
    private static boolean check(int k) {
        for (int i = 2; i*i <=k ; i++) {
            if (k%i==0) return false;
        }
        return true;
    }
}

18.最短路

package Chapter03;

//最短路
public class Demo04 {
    public static void main(String[] args) {
        System.out.println(6);
    }
}

19.Fibonacci 数列与黄金分割

package Chapter03;

import java.util.Scanner;

//Fibonacci 数列与黄金分割
public class Demo05 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        if (N<=20){
            double[] arr = new double[N+1];
            arr[0] = 1.0;
            arr[1] = 1.0;
            for (int i = 2; i <= N; i++) {
                arr[i] = arr[i-1]+arr[i-2];
            }
            double x= arr[N-1]/arr[N];
            System.out.println(String.format("%.8f",x));
        }else {
            //n超过20的时候,前八位小数已经相同。
            System.out.println(0.61803399);
        }
    }
}

20.分数

package Chapter04;

//分数
public class Demo01 {
    public static void main(String[] args) {
        int x=1,y=1;
        for (int i = 1; i < 20; i++) {
            y = y*2;
            x = y*2-1;
        }
        System.out.println(x+"/"+y);
    }
}

21.星期一

package Chapter04;

import java.util.Calendar;

//星期一
public class Demo02 {
    public static void main(String[] args) {
        Calendar x = Calendar.getInstance();
        x.set(1901,0,1);
        int sum = 0;
        while (x.get(Calendar.YEAR)<2001){
            if (x.get(Calendar.DAY_OF_WEEK)==Calendar.MONDAY){
                sum++;
            }
            x.add(Calendar.DATE,1);
        }
        System.out.println(sum);
    }
}

22.方格计数

package Chapter04;

//方格计数
//不是很懂。
public class Demo03 {
    public static void main(String[] args) {
        int r=50000,y=r;
        long ans=0;
        for (int x = 1; x <=r ; x++) {
            while (x*x+y*y > r*r && y>0)
                y--;
            ans+=y;
        }
        System.out.println(ans*4);//先算四分之一。
    }
}

23.迷宫

package Chapter05;

//迷宫
public class Demo01 {
    static String[] date = new String[10];
    static int ans;//计数
    static int[][] vis = new int[10][10];//标记

    //dfs
    static boolean solve(int i, int j){
        //能走出去。
        if (i<0 || i>9 || j<0 || j>9){
            return true;
        }
        //到了被标记的地方了,不能走出去了。
        if (vis[i][j]==1){
            return false;
        }
        vis[i][j] = 1;//标记一下。
        switch (date[i].charAt(j)){
            case 'U':
                return solve(i-1,j);
            case 'D':
                return solve(i+1,j);
            case 'L':
                return solve(i,j-1);
            case 'R':
                return solve(i,j+1);
            default:
                return false;
        }
    }

    public static void main(String[] args) {
        date[0] = "UDDLUULRUL";
        date[1] = "UURLLLRRRU";
        date[2] = "RRUURLDLRD";
        date[3] = "RUDDDDUUUU";
        date[4] = "URUDLLRRUU";
        date[5] = "DURLRLDLRL";
        date[6] = "ULLURLLRDU";
        date[7] = "RDLULLRDDD";
        date[8] = "UUDDUDUDLL";
        date[9] = "ULRDLUURRR";
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                clr(vis);
                boolean res = solve(i,j);//判断是否能走出去。
                if (res)
                    ans++;
            }
        }
        System.out.println(ans);
    }

    //回溯
    private static void clr(int[][] vis) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                vis[i][j] = 0;
            }
        }
    }
}

24.9数算式

package Chapter05;

import java.util.HashSet;
import java.util.Set;

//9数算式
//全排列
public class Demo02 {
    static int[] a = {1,2,3,4,5,6,7,8,9};
    static int ans;

    public static void main(String[] args) {
       f(0);
       System.out.println(ans/2);
    }

    private static void f(int k) {
        if (k==9){
            for (int i = 0; i <9 ; i++) {
                int x1 = a2i(0,i);
                int x2 = a2i(i,9);
                int x = x1*x2;
                if (check(x)){
                    ans++;
                }
            }
        }
        for (int i = k; i <9 ; i++) {
            int t=a[k];a[k]=a[i];a[i]=t;
            f(k+1);
            t=a[k];a[k]=a[i];a[i]=t;//回溯
        }
    }

    //检查
    private static boolean check(int x) {
        String s = x + "";
        if (s.length()!=9 || s.indexOf('0')>-1) return false;
        Set<Character> set = new HashSet<Character>();
        for (int i = 0; i < s.length(); i++) {
            set.add(s.charAt(i));
        }
        return set.size()==9;
    }

    //得到乘数和被乘数。
    private static int a2i(int i, int j) {
        int count = 0;
        int p = 1;
        for (int k = j-1; k >=i ; k--) {
            count+=a[k]*p;
            p*=10;
        }
        return count;
    }

}

25.字符组串

package Chapter05;

//字符组串
public class Demo03 {

    static int f(int a, int b, int c, int n)
    {
        if(a<0 || b<0 || c<0) return 0;
        if(n==0) return 1;

        return f(a-1,b,c,n-1)+f(a,b-1,c,n-1)+f(a,b,c-1,n-1);  //填空
    }

    public static void main(String[] args) {
        System.out.println(f(1,1,1,2));
        System.out.println(f(1,2,3,3));
    }
}

25.平方和

package 练习;

//平方和
public class Demo01 {
    public static void main(String[] args) {
        long sum = 0;
        for (int i = 1; i <=2019 ; i++) {
            int x = i;
            while (x>0){
                int n = x%10;
                if (n==2 || n==0 || n==1 || n==9){
                    sum += i*i;
                    break;
                }
                x = x/10;
            }
        }
        System.out.println(sum);
    }
}

25.数列求值

package 练习;

//数列求值
public class Demo02 {
    //方法一
    /*public static void main(String[] args) {
        int[] arr = new int[3];
        arr[0]=1;
        arr[1]=1;
        arr[2]=1;
        for (int i = 4; i <=20190324 ; i++) {
           int t = arr[0]+arr[1]+arr[2];
           t = t%10000;
           arr[0]=arr[1];
           arr[1]=arr[2];
           arr[2]=t;
        }
        System.out.println(arr[2]);
    }*/


    //方法二
    public static void main(String[] args) {
        int[] arr = new int[20190324+1];
        arr[1]=1;
        arr[2]=1;
        arr[3]=1;
        for (int i = 4; i <=20190324 ; i++) {
            arr[i] = (arr[i-1]+arr[i-2]+arr[i-3])%10000;
        }
        System.out.println(arr[20190324]);
    }
}

25.最大降雨量

package 练习;

//最大降雨量
/*
 如果正常按照顺序排序,那么数据将会是这样子的:
 1,2,3|4|5,6,7,
 8,9,10|11|12,13,14,
 15,16,17|18|19,20,21,
 22,23,24|25|26,27,28, 这里是第四周
 29,30,31|32|33,34,35,
 36,37,38|39|40,41,42,
 43,44,45|46|47,48,49,
 这样排序好像也海星?但是题目要求的是最大值。
 也就是说我们在保证每一周都比上一周大的同时,还要尽量确保第四周的值尽可能的大。
 要完成这样,也就得在后面几周来消耗前面的小数,如1,2,3。
 这样才能保证每一周的增长都是大的。
 从后面几周来推算。
 49 48 47 46 3 2 1 这样保证最后一周是最大的同时,又消耗掉了3,2,1。
 45 44 43 42 6 5 4 消耗掉了 6,5,4
 41 40 39 38 9 8 7 消耗掉了 7 8 9
 37 36 35 34 12 11 10 消耗掉了 12 11 10
 33 32 31 30 15 14 13 消耗掉了 15 14 13
 29 28 27 26 18 17 16 消耗掉了 18 17 16
 25 24 23 22 21 20 19 消耗掉了 21 20 19
 然后再把它转换过来看,因为中位数是需要升序来排的。
 第七周:1 2 3 46 47 48 49
 第六周: 4 5 6 42 43 44 45
 第五周: 7 8 9 38 39 40 41
 第四周: 10 11 12 34 35 36 37
 第三周: 13 14 15 30 31 32 33
 第二周: 16 17 18 26 27 28 29
 第一周: 19 20 21 22 23 24 25
 再按照周数来排中位数,也就是从第一周排到第七周(上面我们已经进行了排序)。
 22,26,30,34,39,43,47
 这时候的中位数就是34,大于我们正常排序得到的中位数。
 */
public class Demo03 {
    public static void main(String[] args) {
        System.out.println(34);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值