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

前言

哈哈哈,没想到吧,上一篇文章是补的周末合刊,而这篇才是今天的内容。从这里开始,才是我每天在蓝桥杯官网找的真题,由于我的算法基础并不好,所以我做的题大多都是易,但是我觉得也有学习意义,不积跬步无以至千里,不积小流无以成江海你。

主要内容

1

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

import java.util.*;


public class Test7 {
    public static void main(String[] args) {
        //冰雹数
        //任意给定一个正整数N
        //如果是偶数,执行:N/2
        //如果是奇数,执行:N×3+1
        //生成的新的数字再执行同样的动作,循环往复。
        //通过观察发现,这个数字会一会儿上升到很高,一会儿又降落下来。
        //就这样起起落落的,但最终必会落到"1",这有点像小冰雹粒子在冰雹云中翻滚增长的样子。
        //比如N=9
        //9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
        //可以看到,N=9的时候,这个"小冰雹"最高冲到了52这个高度。

        //scanner用法
        //Scanner sc = new Scanner(System.in);
        //int n = sc.nextInt();
        //System.out.println(n);
        //sc.close();
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        Set<Long> set = new HashSet<>();
        //输入一个N
        int N = scan.nextInt();
        //对N进行处理,从不大于N的奇数开始
        int n = N % 2 == 0 ? N - 1 : N;
        //max存储能到达的最大值
        long max = N;
        //temp存储每次寻找的中间数
        long temp;
        //循环i的范围是[n,1)之间的奇数
        for (int i = n; i > 1; i -= 2) {
            //如果set里已经有i了,说明之前寻找过程中已经出现i,不必再寻找了
            if (set.contains((long) i)) continue;

            temp = i;
            //寻找过程...
            while (temp != 1 && !set.contains(temp)) {
                set.add((temp));//对当前的temp,存进set
                if (temp % 2 == 1) {
                    temp = temp * 3 + 1;
                }
                max = Math.max(max, temp);
                while (temp % 2 == 0) {
                    temp /= 2;
                }
            }
        }

        System.out.println(max);
        scan.close();
    }
}

2

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

import java.util.*;
public class Test8 {
    public static void main(String[] args) {
        //福尔摩斯从 X 星收到一份资料,全部是小写字母组成。
        //他的助手提供了另一份资料:许多长度为 8 的密码列表。
        //福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
        //请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
        //输入描述
        //输入第一行:一个字符串 s 全部由小写字母组成,长度小于 1024*1024。
        //紧接着一行是一个整数n表示以下有n 行密码,1≤n≤1000。
        //紧接着是n行字符串,都是小写字母组成,长度都为 8。
        //输出描述
        //输出一个整数, 表示每行密码的所有排列在s 中匹配次数的总和。

        //这是gpt的答案,未通过
        Scanner sc = new Scanner(System.in);

        // 第一份资料:长字符串
        String S = sc.nextLine();

        // 第二份资料:密码个数
        int m = sc.nextInt();
        sc.nextLine(); // 吃掉换行

        while (m-- > 0) {
            String P = sc.nextLine(); // 长度为 8 的密码

            int[] cntP = new int[26];
            int[] cntS = new int[26];

            // 统计密码字母出现次数
            for (char c : P.toCharArray()) {
                cntP[c - 'a']++;
            }

            int len = S.length();

            // 初始化第一个窗口
            for (int i = 0; i < 8; i++) {
                cntS[S.charAt(i) - 'a']++;
            }

            // 判断第一个窗口
            if (Arrays.equals(cntP, cntS)) {
                System.out.println(0);
            }

            // 滑动窗口
            for (int i = 8; i < len; i++) {
                // 加右边
                cntS[S.charAt(i) - 'a']++;
                // 去左边
                cntS[S.charAt(i - 8) - 'a']--;

                if (Arrays.equals(cntP, cntS)) {
                    System.out.println(i - 7);
                }
            }
        }

        sc.close();

    }
}

//以下是蓝桥杯的代码分享,能通过,但是存在内存溢出等问题
//import java.util.Arrays;
//import java.util.Scanner;
//
//public class Main {
//    public static void main(String[] args) {
//        Scanner sc = new Scanner(System.in);
//
//        // 读取第一行输入的字符串 s
//        String s = sc.nextLine();
//
//        // 如果字符串 s 的长度小于 8,则直接输出 0 并返回
//        if (s.length() < 8) {
//            System.out.println(0);
//            return;
//        }
//
//        // 读取整数 n
//        int n = sc.nextInt();
//
//        // 读取换行符,确保下一次读取的是字符串
//        sc.nextLine();
//
//        // 初始化答案变量
//        int ans = 0;
//
//        // 循环处理 n 个字符串
//        while (n-- > 0) {
//            // 读取一个字符串并转换为字符数组
//            char[] t = sc.nextLine().toCharArray();
//
//            // 对字符数组进行排序
//            Arrays.sort(t);
//
//            // 遍历字符串 s 的所有长度为 8 的子串
//            for (int j = 0; j <= s.length() - 8; j++) {
//                // 获取长度为 8 的子串并转换为字符数组
//                char[] temp = s.substring(j, j + 8).toCharArray();
//
//                // 对子串进行排序
//                Arrays.sort(temp);
//
//                // 如果排序后的子串与 t 相等,则增加答案计数
//                if (Arrays.equals(temp, t)) {
//                    ans++;
//                }
//            }
//        }
//
//        // 输出最终的答案
//        System.out.println(ans);
//    }
//}

3

java 复制代码
package com.njx.topic1;
import java.util.*;
public class Test9 {
    public static void main(String[] args) {
        //乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
        //请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。
        //输入描述
        //输入一个整数n(0<n<1000),表示开始购买的饮料数量。
        //输出描述
        //输出一个整数,表示实际得到的饮料数
        //简单
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();   // 初始购买的饮料数
        int total = n;          // 总共喝到的饮料数
        int caps = n;           // 当前瓶盖数

        // 只要还能兑换
        while (caps >= 3) {
            int exchange = caps / 3; // 本轮能换几瓶
            total += exchange;       // 喝掉这些
            caps = caps % 3 + exchange; // 剩余瓶盖 + 新瓶盖
        }

        System.out.println(total);
        sc.close();
    }
}

4

java 复制代码
package com.njx.topic1;
import java.util.*;
public class Test10 {
    public static void main(String[] args) {
        //在数列 α1,α2,···,αn 中,如果对于下标i, j,k 满足 0 <i < j <k<n+ 1且a <aj < ak,则称a,aj,ak为-组递增三元组,α; 为递增三元组的中心。
        //给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
        //输入描述
        //输入的第一行包含一个整数n。
        //第二行包含n个整数α1,α2,···,αn,相邻的整数间用空格分隔,表示给定的数列。
        //其中,2≤n≤ 1000,0≤ 数列中的数≤10000。
        //输出描述
        //输出一行包含一个整数,表示答案。
        //只要左右都有符合左小右大即可,不要求紧挨着

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int[] a = new int[n];

        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }

        int ans = 0;

        // 枚举中心位置 j
        for (int j = 1; j <= n - 2; j++) {
            boolean hasSmallerLeft = false;
            boolean hasLargerRight = false;

            // 左边找 a[i] < a[j]
            for (int i = 0; i < j; i++) {
                if (a[i] < a[j]) {
                    hasSmallerLeft = true;
                    break;
                }
            }

            // 右边找 a[k] > a[j]
            for (int k = j + 1; k < n; k++) {
                if (a[k] > a[j]) {
                    hasLargerRight = true;
                    break;
                }
            }

            if (hasSmallerLeft && hasLargerRight) {
                ans++;
            }
        }

        System.out.println(ans);
        sc.close();
    }
}

最后一语

这几道题也废了我不少时间,主要有些题目感觉很简单却容易忽视内存和所有的条件,还有就是要记住模板,在后面的几期我尽量找专题模板去做,加深处理能力,和背模板。

愿我们有远大梦想,愿我们的葫芦盛满水,愿风为我们吹,水为我们流,愿爱指挥我们。

------ 鲁米 《愿我们有远大梦想》
感谢观看,共勉!!

相关推荐
NE_STOP2 小时前
MyBatis-配置文件解读及MyBatis为何不用编写Mapper接口的实现类
java
后端AI实验室7 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风9 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme9 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
Be_Better9 小时前
学会与虚拟机对话---ASM
java
开源之眼11 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori31612 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户9083246027312 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋13 小时前
DecimalFormat 与 BigDecimal
java·后端
beata13 小时前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端