2021年第十二届蓝桥杯模拟赛(第四期)题目和解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 蓝桥杯是指蓝桥杯全国软件和信息技术专业人才大赛。是由工业和信息化部人才交流中心举办的全国性IT学科赛事。共有北京大学、清华大学、上海交通大学等全国1200余所高校参赛。

题目:

所有答案均为个人想法 仅供参考,如有问题 欢迎指正


一、填空题

题目1

在这里插入图片描述

问题描述
  ASCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请编码为 80 的是哪个字母?


个人答案:

P

个人代码:

public class Main{
    public static void main(String[] args) {
        char c= 80;
        System.out.println(c);
    }
}



题目2

在这里插入图片描述

问题描述
  请问在 1900 到 2020 中,有多少个质数。


个人答案:

16

个人代码:

public class Main {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 1900; i <= 2020; ++i) {
            if (isPrime(i)) {
                count++;
            }
        }
        System.out.println(count);
    }

    static boolean isPrime(int n) {
        for (int i = 2; i * i < n; ++i) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
}



题目3

在这里插入图片描述

问题描述
  有一棵二叉树,有2021个叶结点。
  请问。这棵树至少有多少个结点?


个人答案:

4041

二叉树的性质:

性质1: 二叉树的第i层上至多有2^(i-1)(i≥1)个节点。
性质2: 深度为h的二叉树中至多含有2^h-1个节点。
性质3: 若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有 n0=n2+1
性质4: 具有n个节点的完全二叉树深为log2x+1(其中x表示不大于n的最大整数)。

个人理解:

由性质3可知n0=n2+1,题目中n0=2021,则n2=2020.
题目中问的是最少,最少情况下n1=0.
n=n0+n1+n2=2021+0+2020=4041



题目4

在这里插入图片描述

问题描述
  Fibonacci序列按照如下公式定义:
  F[1] = 1
  F[2] = 1
  F[i] = F[i-1] + F[i-2] (i>2)
  前几个 Fibonacci 数为 1, 1, 2, 3, 5, 8, 13, 21。
  请问,前100个 Fibonacci 数中,有多少个数是 3 的倍数?


个人答案:

25

个人代码:

import java.math.BigInteger;
public class Test {
    public static void main(String[] args) {
        BigInteger[] arr = new BigInteger[100];
        BigInteger three = new BigInteger(String.valueOf(3));
        int count = 0;
        arr[0] = new BigInteger(String.valueOf(1));
        arr[1] = new BigInteger(String.valueOf(1));
        for (int i = 2; i < arr.length; ++i) {
            arr[i] = arr[i - 1].add(arr[i - 2]);
            if (arr[i].mod(three).intValue() == 0) {
                count++;
            }
        }
        System.out.println(count);
    }
}



题目5

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题描述
  一个身份证号码有 18 位数字或字母组成。其中前17位必须是数字,最后一位可能是数字或字母X。
  身份证号码满足一定的校验规则。
  令身份证号从右到左依次标号为 1 到 18,其中标号为 i 的位的位权设置为 2^(i-1) mod 11 (2的i-1次方除以 11 的余数)。
  将每一位的数值乘以位权后相加,得到的结果除以 11 的余数应当为 1。其中最后一位(标号为1)中如果出现字母 X,看成数字 10。
  例如,如果一个人的身份证号为 34052419800101001X,则:
  标号为 1 的位,位权 1,数值 X,即 10,相乘得 10。
  标号为 2 的位,位权 2,数值 1,相乘得 10。
  标号为 3 的位,位权 4,数值 0,相乘得 0。
  标号为 4 的位,位权 8,数值 0,相乘得 0。
  标号为 5 的位,位权 5,数值 1,相乘得 5。
  标号为 6 的位,位权 10,数值 0,相乘得 0。
  标号为 7 的位,位权 9,数值 1,相乘得 9。
  标号为 8 的位,位权 7,数值 0,相乘得 0。
  标号为 9 的位,位权 3,数值 0,相乘得 0。
  标号为 10 的位,位权 6,数值 8,相乘得 48。
  标号为 11 的位,位权 1,数值 9,相乘得 9。
  标号为 12 的位,位权 2,数值 1,相乘得 2。
  标号为 13 的位,位权 4,数值 4,相乘得 16。
  标号为 14 的位,位权 8,数值 2,相乘得 16。
  标号为 15 的位,位权 5,数值 5,相乘得 25。
  标号为 16 的位,位权 10,数值 0,相乘得 0。
  标号为 17 的位,位权 9,数值 4,相乘得 36。
  标号为 18 的位,位权 7,数值 3,相乘得 21。
  将乘积相加,得 199,除以 11 的余数正好为 1。
  小明的身份证号前 17 位为 11010120210221999,请问小明身份证的最后一位是多少?


个人答案:

8

个人代码:

public class Main{
    public static void main(String[] args) {
        String s = "11010120210221999";
        int[] arr = new int[s.length()];
        int sum = 0;
        for (int i = 0; i < s.length(); ++i) {
            char c = s.charAt(s.length() - 1 - i);
            arr[i] = (int) ((c - '0') * (Math.pow(2, i + 1) % 11));
            sum += arr[i];
        }

        for (int i = 0; i <= 10; ++i) {
            if ((i + sum) % 11 == 1) {
                System.out.println(i == 10 ? "X" : i);
                break;
            }
        }
    }

}



二、编程题


题目6

在这里插入图片描述在这里插入图片描述

问题描述
小Hi的公司经常举办回馈社会的爱心活动。这次小Hi作为志愿者带领社区的孩子们参观了青少年天文馆。他发现孩子们对于摩尔斯电码非常感兴趣。

摩尔斯电码由两种基本的信号组成:短信号"滴"(用字符'.'表示)以及长信号"嗒"(用字符'-'表示)。下图是数字0-9的摩尔斯电码表示,每个数字都由5个字符组成:

.----  ..---  ...--  ....-  .....  -....  --...  ---..  ----.  -----
1     2       3      4     5    6     7      8        9      0
为了让孩子们开心,小Hi决定把每位孩子的生日日期转化为摩尔斯码赠送给他们。例如日期20210101对应的摩尔斯电码是:

..--- ----- ..--- .---- ----- .---- ----- .----
你能写一个程序帮助小Hi吗?

输入格式
第一行是一个整数N,代表参加活动的孩子的人数。(1 <= N <= 100)

以下N行每行一个由0-9组成的字符串,代表一个生日日期。(日期格式:yyyymmdd,日期范围: 20000101至20210101)

输出格式
对于每个生日日期,输出一行表示转化后的摩尔斯码,数字之间用一个空格隔开。

样例输入
2
20161011
20000101
样例输出
..--- ----- .---- -.... .---- ----- .---- .----
..--- ----- ----- ----- ----- .---- ----- .----


个人答案:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] msdm = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."};
        int n = sc.nextInt();
        sc.nextLine();
        String[] s = new String[n];
        for (int i = 0; i < n; i++) {
            s[i] = sc.nextLine();
        }

        String[] arr = new String[n];
        for (int i = 0; i < n; ++i) {
            arr[i] = "";
            for (int j = 0; j < s[i].length(); ++j) {
                arr[i] += msdm[s[i].charAt(j) - '0'];
                if (j != s[i].length() - 1) {
                    arr[i] += " ";
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            System.out.println(arr[i]);
        }
    }
}



题目7

在这里插入图片描述
在这里插入图片描述

问题描述
  给定一个单词,请将这个单词的首字母大写,后面的所有字母小写。
输入格式
  输入一行包含一个字符串,表示给定的单词。
输出格式
  输出变换后的单词。
样例输入
hello
样例输出
Hello
样例输入
WORLD
样例输出
World
样例输入
LanQiao
样例输出
Lanqiao
数据规模和约定
  对于所有评测用例,单词的长度不超过 100,单词中只包含大小写英文字母。


个人答案:

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        String losweS = s.toLowerCase();
        System.out.println((char) (losweS.charAt(0) - 32) + losweS.substring(1));
    }
}



题目8

在这里插入图片描述
在这里插入图片描述

问题描述
  给定一个序列 S = (s[1], s[2], ..., s[n]),一个位置 p 上的变化度是指以这个位置为中心的相邻的 5 个元素的最大值与最小值的差,即 s[p-2], s[p-1], s[p], s[p+1], s[p+2] 中最大值与最小值的差。
  一个序列总共有 n-4 个变化度,位置 1, 2, n-1, n 没有变化度。
  例如,对于下面的序列 (1, 0, 4, 8, 5, 7, 6),总共有 3, 4, 5 三个位置有变化度,分别为 8, 8, 4。
  给定一个序列,请求出这个序列的变化度。
输入格式
  输入的第一行包含一个整数 n,表示给定的序列长度。
  第二行包含 n 个整数 s[1], s[2], ..., s[n],表示给定的序列。
输出格式
  输出一行,包含 n-4 个非负整数,分别表示每个位置的变化度。
样例输入
7
1 0 4 8 5 7 6
样例输出
8 8 4
数据规模和约定
  对于所有评测用例,5 <= n <= 1000,0 <= s[i] <= 1000000。


个人答案:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        int[] arr = new int[n];
        for (int i = 0; i < n; ++i) {
            arr[i] = sc.nextInt();
        }
        int max, min;
        for (int i = 2; i < n - 2; ++i) {
            max = arr[i];
            min = arr[i];
            for (int j = i - 2; j <= i + 2; ++j) {
                if (max < arr[j]) {
                    max = arr[j];
                }
                if (min > arr[j]) {
                    min = arr[j];
                }
            }
            System.out.print(max - min);
            if (i != n - 3) {
                System.out.print(" ");
            }
        }
    }
}



题目9

在这里插入图片描述
在这里插入图片描述

问题描述
  给定一个序列 (a_1, a_2, ..., a_n), 定义序列中的一个递增三元组是指三个下标 i, j, k 对应的三个元素 a_i, a_j, a_k,这三个元素满足 a_i < a_j < a_k。
  例如序列 (1, 1, 4, 3, 2, 4) 有以下 4 个递增三元组:
  1. 下标 1, 4, 6 对应的 1, 3, 4;
  2. 下标 1, 5, 6 对应的 1, 2, 4;
  3. 下标 2, 4, 6 对应的 1, 3, 4;
  4. 下标 2, 5, 6 对应的 1, 2, 4。
  注意,可能有下标不同但对应数值相同的三元组,他们应当算成不同的三元组。
  给定序列,请问序列中一共有多少个不同的递增三元组。
输入格式
  输入第一行包含一个整数 n,表示序列的长度。
  第二行包含 n 个整数 a_1, a_2, ..., a_n,表示给定的序列。
输出格式
  输出一行,包含一个整数,表示序列中的递增三元组数量。请注意答案可能很大,可能超过 32 位二进制整数的范围,建议使用 64 位二进制整数。
样例输入
6
1 1 4 3 2 4
样例输出
4
数据规模和约定
  对于 30% 的评测用例,1 <= n <= 20, 0 <= a_i <= 10。
  对于 50% 的评测用例,1 <= n <= 1000, 0 <= a_i <= 100。
  对于 80% 的评测用例,1 <= n <= 10000, 0 <= a_i <= 100。
  对于所有评测用例,1 <= n <= 100000, 0 <= a_i <= 100。


个人答案:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();
        int[] arr = new int[n + 1];
        for (int i = 1; i <= n; ++i) {
            arr[i] = sc.nextInt();
        }
        int[][] dp = new int[n + 1][4];
        for (int i = 1; i < dp.length; ++i) {
            dp[i][1] = 1;
        }

        for (int i = 1; i <= n; ++i) {
            for (int j = 2; j <= 3; ++j) {
                for (int k = 0; k < i; ++k) {
                    if (arr[i] > arr[k]) {
                        dp[i][j] = dp[i][j] + dp[k][j - 1];
                    }
                }
            }
        }
        
        int count = 0;
        for (int i = 0; i <= n; ++i) {
            count += dp[i][3];
        }
        System.out.println(count);
    }
}



题目10

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

问题描述
  给定两个序列 A=(a_1, a_2, ..., a_n) 和 B=(b_1, b_2, ..., b_m), 它们的一个公共子序列是指从两个序列中分别取出相同个数的元素,按照原来的顺序排列后,对应位置的数值相等。
  例如,对于序列 A=(3, 2, 7, 6, 7) 和 B=(2, 3, 5, 7),可以在序列 A 中取出第 2, 3 个元素,在序列 B 中取出第 1, 4 个元素,值都是 2, 7,因此 2, 7 是一个公共子序列,在 A 中取第 2, 3 个元素和在 B 中取 1, 4 个元素是这个公共子序列的一种取法。
  在这两个序列中,有 4 中取法可以取出长度为 2 的公共子序列,例如
  1. 在 A 中取第 1, 3 个元素,在 B 中取 2, 4 个元素;
  1. 在 A 中取第 1, 5 个元素,在 B 中取 2, 4 个元素;
  1. 在 A 中取第 2, 3 个元素,在 B 中取 1, 4 个元素;
  1. 在 A 中取第 2, 5 个元素,在 B 中取 1, 4 个元素。
  给定两个序列,请问有多少种取法可以取出长度为 k 的公共子序列。
输入格式
  输入第一行包含三个整数 n, m, k,分别表示序列 A 的长度、序列 B 的长度和公共子序列的长度。
  第二行包含 n 个整数 a_1, a_2, ..., a_n,表示给定的 A 序列。
  第三行包含 m 个整数 b_1, b_2, ..., b_m,表示给定的 B 序列。
输出格式
  输出一行,包含一个整数,表示长度为 k 的公共子序列的数量,答案可能很大,请输出答案除以 1000007 的余数。
样例输入
5 4 2
3 2 7 6 7
2 3 5 7
样例输出
4
数据规模和约定
  对于 30% 的评测用例,1 <= n, m <= 20。
  对于 50% 的评测用例,1 <= n, m <= 100。
  对于所有评测用例,1 <= n, m <= 1000, 1 <= k <= 10, 0 <= a_i <= 100。


个人答案:


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int k = sc.nextInt();
        int[] a1 = new int[n + 1];
        int[] a2 = new int[m + 1];
        for (int i = 1; i <= n; ++i) {
            a1[i] = sc.nextInt();
        }
        for (int i = 1; i <= m; ++i) {
            a2[i] = sc.nextInt();
        }
        
        //n表示A序列   m表示B序列  k表示公共序列长度
        int[][][] dp = new int[n + 1][m + 1][k + 1];
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                if (a1[i] == a2[j]) {
                    dp[i][j][1] = 1;
                }
            }
        }

        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                for (int l = 2; l <= k; ++l) {
                
                    if (dp[i][j][l - 1] > 0) {
                        for (int iq = 1; iq < i; ++iq) {
                            for (int jq = 1; jq < j; ++jq) {
                                if (dp[iq][jq][l - 1] > 0) {
                                    dp[i][j][l] = dp[i][j][l] + dp[iq][jq][l - 1];
                                }
                            }
                        }
                        
                    }
                }
            }
        }

        int count = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j <= m; ++j) {
                if (dp[i][j][k] > 0) {
                    count += dp[i][j][k];
                }
            }
        }
        System.out.println(count);
    }
}
目录
相关文章
|
2月前
|
JSON JavaScript 前端开发
蓝桥杯web组赛题解析和杯赛技巧
本文作者是一位自学前端两年半的大一学生,在第十五届蓝桥杯Web组比赛中获得省一和国三。文章详细解析了比赛题纲,涵盖HTML、CSS、JavaScript、Echarts和Vue等技术要点,并分享了备赛技巧和比赛经验。作者强调了多写代码和解题思路的重要性,同时提供了省赛和国赛的具体流程及注意事项。希望对参赛者有所帮助。
94 3
|
3月前
|
网络协议 PHP
软件设计师软考题目解析21 --每日五题
每日五题解析,包括海明码纠错、POP3协议通信模式、中断处理、HTML邮件链接创建和结构化开发方法中的接口设计等知识点。
19 1
|
3月前
|
算法 测试技术
软件设计师软考题目解析24 --每日五题
这篇文章提供了软件设计师软考的每日五题解析,包括测试用例设计、软件维护类型、路径覆盖测试、软件维护工具和系统改进等知识点。
37 0
软件设计师软考题目解析24 --每日五题
|
3月前
|
项目管理
软件设计师软考题目解析20之英语题
软件设计师软考中英语题目的解析和答题技巧,帮助考生攻克英语部分的题目。
27 0
软件设计师软考题目解析20之英语题
|
3月前
|
存储 数据安全/隐私保护
软件设计师软考题目解析下午题01
这篇文章提供了对软件设计师软考下午题目的解析,涉及农业基地信息化管理服务平台的人员管理、基地管理、种植管理、投入品管理和信息服务功能,并要求考生根据上下文描述和数据流图来回答问题。
34 0
软件设计师软考题目解析下午题01
|
3月前
|
前端开发 数据处理
软件设计师软考题目解析23 --每日五题
每日五题解析,涉及结构化开发方法的特点、数据流图的基本加工、MVC体系结构的优点以及模块间耦合类型的判断等知识点。
25 0
|
3月前
|
算法 数据建模 数据库
软件设计师软考题目解析22 --每日五题
每日五题解析,涉及结构化开发方法中的接口设计依据、数据结构和算法设计、数据流图的使用场景、外部实体的识别以及决策树在数据流图中表示复杂条件逻辑的应用。
24 0
|
3月前
|
测试技术
软件设计师软考题目解析19 --每日五题
这篇文章提供了软件设计师软考的每日五题解析,包括白盒测试方法、回归测试、面向对象开发方法、总线复用方式和海明码纠错等知识点。
19 0
|
3月前
|
算法 Ruby
软件设计师软考题目解析18 --每日五题
这篇文章提供了软件设计师软考的每日五题解析,包括计算机指令周期、软件设计阶段、模块化原则、程序控制结构和软件项目规模确定等知识点。
38 0
|
3月前
|
存储
软件设计师软考题目解析17 --每日五题
这篇文章提供了软件设计师软考的每日五题解析,包括页面变换、段页式存储管理、可变式分区分配、虚拟页式存储管理和I/O接口编址等计算机系统相关题目。
137 0

推荐镜像

更多
下一篇
开通oss服务