第十一届蓝桥杯省模拟赛大学B组[Java语言描述]题目+题解+总结

本文介绍了第十一届蓝桥杯省模拟赛大学B组的Java语言题目,包括全排列问题、合法括号序列、字节计算等,并给出了详细的解题思路和答案,涉及算法、数据结构与动态规划等内容。


总结:
      总体而言,还是熟悉的难度,细心点,前9题除了那个dp,应该可以全部正确的,第十题随缘~~有时间了写个暴力,没时间就算了,
      但因为不够细心吧,这次的单词加密送分题.没拿到分
      下次还是用比较稳的方法吧,打表数组记录, 一定要细心,血的教训,
      还有就是dp浪费时间太多了,导致第9题简单dfs没时间做,下次有时间在转化dp,没时间就暴力直接提交了
      总而言之,第一遍做题,以做出来为目标,有时间再进行优化,没时间就直接提交暴力代码,蓝桥杯一般暴力都可以拿一半以上的分
      下次正式省赛加油吧!!!

1,蓝桥单词

题目:
将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义。
请问,总共能排列如多少个不同的单词。

分析:水题,全排列去重
当然也可以不写代码
7 ∗ 6 ∗ 5 ∗ 4 ∗ 3 ∗ 2 ∗ 1 / 2 7*6*5*4*3*2*1/2 7654321/2
答案:2520

//全排列
import java.util.HashSet;
import java.util.Set;

/**
 * @author biHuGang
 * @date 2020/4/17
 */
public class Demo1 {
   
   
    static char [] ch = new char[]{
   
   'L','A','N','Q','I','A','O'};
    //static char [] ch = new char[]{'L','A','A'};
    static Set<String> set = new HashSet<>();
    public static void main(String[] args) {
   
   
        int start = 0;
        int end = ch.length-1;
        fullArrangement(start,end);
        System.out.println(set.size());
    }

    private static void fullArrangement(int start, int end) {
   
   
        if (start == end){
   
   
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < ch.length; i++) {
   
   
                sb.append(ch[i]);
            }
            set.add(sb.toString());

        }
        for (int i = start; i <= end; i++) {
   
   
            swap(start,i);
            fullArrangement(start+1, end);
            swap(start,i);
        }
    }

    private static void swap(int start, int end) {
   
   
        char temp = ch[start];
        ch[start] = ch[end];
        ch[end] = temp;

    }
}

2,合法括号序列

题目:
由1对括号,可以组成一种合法括号序列:()。
由2对括号,可以组成两种合法括号序列:()()、(())。
由4对括号组成的合法括号序列一共有多少种?

分析:此题直接手画,反正我是这么做的,没有想到实现起来比较简单的思路,填空题,手算也是一种好方法。
答案:14

3,字节计算

题目:
在计算机存储中,12.5MB是多少字节?

分析:签到题? 12.5 ∗ 1024 ∗ 1024 12.5*1024*1024 12.510241024
答案:13107200

4,无向连通图

题目:
一个包含有2019个结点的无向连通图,最少包含多少条边?

分析:图的基本知识点,了解图的直接秒
有向强连通图: 最多:n(n-1)条边 最少 :n条边
无向连通图: 最多: n(n-1)/2条边 最少:n-1条边
答案:2018

5,反倍数

题目:
给定三个整数 a, b, c如果一个整数既不是a 的整数倍也不是b 的整数倍还不是c 的整数倍,则这个数称为反倍数。
请问在1 至 n 中有多少个反倍数。

输入
输入的第一行包含一个整数n。
第二行包含三个整数 a, b, c相邻两个数之间用一个空格分隔。

输出
输出一行包含一个整数,表示答案。

样例
输入
30
2 3 6
输出
10

评测用例规模与约定:
对于40% 的评测用例,1 <= n <= 10000
对于 80% 的评测用例,1 <= n <= 100000
对于所有评测用例,1 <= n <= 1000000,1 <= a <= n,1 <= b <= n,1 <= c <= n

分析:没啥好说的,一个循环直接暴力
判断如果i不能被a整除并且不能被b整除并且不能被c整除,则满足条件,统计个数即可

//暴力循环求解
import java.util.Scanner;

/**
 * @author biHuGang
 * @date 2020/4/17
 */
public class Demo5 {
   
   
    static int ans = 0;

    public static void main(String[] args) {
   
   
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = scanner.nextInt();
        for (int i = 1; i <= n; i++) {
   
   
            if (i % a != 0 && i % b != 0 && i % c != 0) {
   
   
                ans++;
            }
        }
        System.out.println(ans);
    }
}

6,单词加密

题目:
给定一个单词,请使用凯撒密码将这个单词加密。
凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,…,w变为z,x变为a,y变为b,z变为c。
例如,lanqiao会变成odqtldr。

输入
输入一行,包含一个单词,单词中只包含小写英文字母。

输出
输出一行,表示加密后的密文。

样例
输入
lanqiao
输出
odqtldr

评测用例规模与约定:
对于所有评测用例,单词中的字母个数不超过100

分析
方法一:把明文弄一个数组,密文弄一个数组,替换,拼接字符串即可
方法二:当然此题可以 密文a+3变为明文 a >=x时 a-26+3
送分题,但是我写的太急,数组初始化有一个字母写错---------
很烦,下次还是用第二种方法了

//方法一:数组记录(不建议),我就是教训
import java.util.Scanner;

/**
 * @author biHuGang
 * @date 2020/4/17
 */
public class Demo6 {
   
   
    static char[] ch1 = new char[]{
   
   'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',
            'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
    static char[] ch2 = new char[]{
   
   'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
            'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c'};

    public static void main(String[] args) {
   
   
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        char[] chars = str.toCharArray();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < chars.length; i++) {
   
   
            for (int j = 0; j < 26; j++) {
   
   
                if (chars[i] == ch1[j]) {
   
   
                    chars[i] = ch2[j];
                    sb.append(chars[i]);
                    break;
                }
            }
        }
        System.out.println(sb);
    }
}

建议第二种方法,踏实,不容易出错

//方法二:字符转化即可
import java.util.Scanner;

/**
 * @author biHuGang
 * @date 2020/4/18
 */
public class Demo6Pra {
   
   
    public static void main(String[] args) {
   
   
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        char[] chars = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        int len = chars.length;
        for (int i = 0; i < len; i++) {
   
   
            if (chars[i] < 'x'){
   
   
                sb.append((char) (chars[i]+3));
            }else {
   
   
                sb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值