关于蓝桥杯,赛前最好搞懂的一些知识(java组)

关于蓝桥杯,赛前最好搞懂的一些知识(java组) 你好我是林森lsjs这是我上届蓝桥杯备赛的一些笔记算是偏基础的也希望我能在算法上继续精进目录一、 万能头比赛直接复制粘贴二、\n的技巧三、ArrayList 动态数组1. 基础定义2. 添加元素3. 查找元素4. 删除元素四、sort 排序函数1. 普通数组升序降序排序2. List 集合升序降序排序3. 指定区间部分排序五、向上 / 向下取整六、基础数论手写 GCD/LCM推荐速度快用 BigInteger 自带的 GCD七、位运算 4 技巧1. 判断奇偶2. 判断是不是 2 的幂次3. 找数组中唯一出现一次的数4. 快速计算二进制中 1 的个数八、贪心算法九、多组输入十、读入带空格的字符串nextLine ()十一、数字字符串互转直接背十二、ASCII 码十四、日期问题十五、reverse 反转十六、优先队列堆1. 小根堆默认最小元素在堆顶2. 大根堆最大元素在堆顶3. 常用操作十八、总结一、 万能头比赛直接复制粘贴C 有#include bits/stdc.h万能头一行搞定所有导入。Java 虽然没有真正的万能头但是有蓝桥杯几乎99%会用到的所有导入比赛必写直接复制到代码最开头// 蓝桥杯Java万能导入模板覆盖所有考点 import java.util.*; import java.io.*; import java.math.*;这三行包含了所有你会用到的类java.util.*包含 ArrayList、Arrays、Collections、PriorityQueue、Scanner、StringTokenizer、HashMap、HashSet 等等所有常用工具类java.io.*包含 BufferedReader、InputStreamReader、IOException 等等所有 IO 类java.math.*包含 BigInteger、BigDecimal大数题必用担心导入多余的类会影响性能完全不用Java 编译器会自动优化没用的类不会被编译进最终代码对运行速度没有任何影响。比赛的时候直接把这三行写在最前面二、\n的技巧很多同学习惯写System.out.println();其实可以用System.out.print(\n)手动换行效率高点int a 10, b 20; // 正确写法 System.out.print(a b \n); // 或者单独输出换行 System.out.print(\n);三、ArrayList 动态数组比赛用ArrayList代替普通静态数组不用提前指定大小自动扩容对应 C 里的vector1. 基础定义// 定义存储Integer类型的动态数组 ArrayListInteger arr new ArrayList(); // 定义时直接初始化元素 ArrayListInteger list new ArrayList(Arrays.asList(3, 1, 4, 2, 5));2. 添加元素// 在数组末尾添加元素对应C的push_back arr.add(10); arr.add(20); arr.add(30);3. 查找元素int x 20; // 查找元素第一次出现的下标找不到返回-1 int idx arr.indexOf(x); // 判断元素是否存在 boolean isExist arr.contains(x);4. 删除元素// 按下标删除元素 arr.remove(idx); // 按元素值删除注意要转成Integer包装类 arr.remove(Integer.valueOf(x));四、sort 排序函数排序是蓝桥杯算法题里用的最多的函数之一1. 普通数组升序降序排序public class Main { public static void main(String[] args) { // 1. 基本类型数组int[]只能升序排序 int[] a {3, 1, 4, 2, 5}; Arrays.sort(a); // 升序结果[1, 2, 3, 4, 5] // 2. 包装类数组Integer[]可以降序排序 Integer[] b {3, 1, 4, 2, 5}; // 升序 Arrays.sort(b); // 降序传入Collections.reverseOrder() Arrays.sort(b, Collections.reverseOrder()); } }2. List 集合升序降序排序ArrayListInteger list new ArrayList(Arrays.asList(3, 1, 4, 2, 5)); // 升序 Collections.sort(list); // 降序 Collections.sort(list, Collections.reverseOrder());3. 指定区间部分排序左闭右开区间只排序指定部分的元素int[] a {3, 1, 4, 2, 5}; // 排序下标[1,4)的元素也就是下标1、2、3的元素 Arrays.sort(a, 1, 4); // 排序后数组[3, 1, 2, 4, 5]五、向上 / 向下取整数学题里的取整直接用 Math 类的方法不用自己手写逻辑// 向上取整进一法返回double类型 System.out.println(Math.ceil(3.1)); // 输出4.0 System.out.println(Math.ceil(-3.9)); // 输出-3.0 // 向下取整去尾法返回double类型 System.out.println(Math.floor(3.9)); // 输出3.0 System.out.println(Math.floor(-3.1)); // 输出-4.0六、基础数论手写 GCD/LCM推荐速度快// 求最大公约数GCD辗转相除法 public static long gcd(long a, long b) { while (b ! 0) { long temp a % b; a b; b temp; } return a; } // 求最小公倍数LCM先除后乘防止溢出 public static long lcm(long a, long b) { return (a / gcd(a, b)) * b; }用 BigInteger 自带的 GCDlong a 75, b 30; // 转成BigInteger后调用gcd再转回long long c BigInteger.valueOf(a).gcd(BigInteger.valueOf(b)).longValue();七、位运算 4 技巧1. 判断奇偶核心逻辑奇数二进制最后一位是 1偶数是 0和 1 做按位与运算直接判断。int x 19; if ((x 1) 1) { System.out.println(奇数); } else { System.out.println(偶数); }2. 判断是不是 2 的幂次核心逻辑2 的幂次二进制只有一位是 1x(x-1) 会把最后一个 1 变成 0结果为 0 就是 2 的幂次。public static boolean isPowerOfTwo(long x) { return x 0 (x (x - 1)) 0; }3. 找数组中唯一出现一次的数其他数都出现两次核心逻辑两个相同的数异或结果为 0所有数异或一遍最后剩下的就是只出现一次的数。public static long findUnique(long[] arr) { long res 0; for (long num : arr) { res ^ num; } return res; }4. 快速计算二进制中 1 的个数核心逻辑每次 x(x-1) 会消掉 x 的最后一个 1消到 0 为止计数就是 1 的个数。public static int countOnes(long x) { int cnt 0; while (x 0) { x x - 1; cnt; } return cnt; }八、贪心算法题目里只要出现这些关键词直接往贪心思路上靠大概率没错最多、最少、最优、最佳、尽可能选择、安排、分配、覆盖贪心思路核心先把数据排序升序 / 降序根据题目要求来每次都选当前局面下最优的选择比如能拿大的先拿大的局部最优逐步推出全局最优九、多组输入题目没说有多少组测试数据输入到文件结束为止用Scanner的hasNext()系列方法循环读取public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); // 只要还有下一个int数据就一直读取 while (sc.hasNextInt()) { int n sc.nextInt(); // 在这里写你的逻辑 System.out.print(n * 2 \n); } } }十、读入带空格的字符串nextLine ()遇到需要读取一整行带空格的字符串用Scanner的nextLine()方法直接读取整行内容public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); // 读取一整行包含空格 String s sc.nextLine(); System.out.print(s \n); } }注意坑点如果前面用了nextInt()、next()这类方法缓冲区里会残留换行符需要先调用一次nextLine()清空再读取整行十一、数字字符串互转直接背public class Main { public static void main(String[] args) { // 1. 数字转字符串 int num 123; long num2 456789L; String s1 String.valueOf(num); // 转成String123 String s2 String.valueOf(num2); // 转成String456789 // 2. 字符串转数字 String s3 789; int num3 Integer.parseInt(s3); // 转成int789 long num4 Long.parseLong(s3); // 转成long789L } }十二、ASCII 码字符题本质都是 ASCII 码运算数字0~9ASCII 范围48~57大写字母A~ZASCII 范围65~90小写字母a~zASCII 范围97~122代码里直接强转就能获取 ASCII 码char ch a; // char强转int获取ASCII码 int ascii (int) ch; System.out.println(ascii); // 输出97十四、日期问题蓝桥杯日期题算星期几、算天数、判断日期合法可以套这个public class DateEnumerator { public static void main(String[] args) { // 枚举指定年份范围的所有有效日期 // 只需修改这里的起始和结束年份即可切换时间范围 for (int year 2022; year 2022; year) { for (int month 1; month 12; month) { for (int day 1; day 31; day) { // 自动过滤无效日期和原C代码逻辑完全相同 if (month 1 || month 3 || month 5 || month 7 || month 8 || month 10 || month 12) { // 大月(31天)无需额外判断 } else if (month 2) { // 2月闰年判断 boolean isLeap (year % 4 0 year % 100 ! 0) || year % 400 0; if (isLeap) { if (day 29) break; } else { if (day 28) break; } } else { // 小月(30天) if (day 30) break; } 在这里添加你的题目逻辑 } } } } }十五、reverse 反转public class Main { public static void main(String[] args) { // 1. 反转字符串用StringBuilder String s abcde; String revS new StringBuilder(s).reverse().toString(); System.out.println(revS); // 输出edcba // 2. 反转List集合用Collections.reverse() ArrayListInteger list new ArrayList(Arrays.asList(1, 2, 3, 4, 5)); Collections.reverse(list); System.out.println(list); // 输出[5,4,3,2,1] // 3. 反转普通数组手动交换 int[] arr {1, 2, 3, 4, 5}; for (int i 0, j arr.length - 1; i j; i, j--) { int temp arr[i]; arr[i] arr[j]; arr[j] temp; } } }十六、优先队列堆蓝桥杯里需要频繁取最大 / 最小元素的时候直接用PriorityQueue堆自动帮你排好序最值永远在堆顶1. 小根堆默认最小元素在堆顶// 定义存储Integer的小根堆 PriorityQueueInteger minHeap new PriorityQueue();2. 大根堆最大元素在堆顶需要传入Collections.reverseOrder()自定义排序规则// 定义存储Integer的大根堆 PriorityQueueInteger maxHeap new PriorityQueue(Collections.reverseOrder());3. 常用操作// 1. 插入元素自动排序 minHeap.offer(5); minHeap.offer(1); minHeap.offer(3); // 2. 获取堆顶元素不删除获取最小/大值 int top minHeap.peek(); // 小根堆堆顶是1大根堆是5 // 3. 删除堆顶元素删除最小/大值 minHeap.poll();十八、总结万能导入import java.util.*;java.io.*;java.math.*;三行覆盖所有考点无性能影响。动态数组用ArrayList替代静态数组自动扩容掌握增删查基础操作。排序函数Arrays.sort()处理数组Collections.sort()处理 List支持升序 / 降序和指定区间排序。取整运算Math.ceil()向上取整Math.floor()向下取整直接调用无需手写。数论基础手写辗转相除法求 GCD再推导 LCM先除后乘防溢出也可使用BigInteger自带方法。位运算技巧快速判断奇偶、2 的幂次、找唯一出现一次的数、统计二进制中 1 的个数。贪心算法出现 最多 / 最少 / 最优 / 分配 等关键词优先考虑先排序再做局部最优选择。多组输入用sc.hasNextInt()等循环读取处理未知组数的测试数据。整行读取nextLine()读取带空格字符串注意先清空nextInt()残留的换行符。类型转换数字转字符串用String.valueOf()字符串转数字用Integer.parseInt()/Long.parseLong()。ASCII 码字符题本质是 ASCII 运算记住数字、大小写字母的 ASCII 范围。日期问题三层循环枚举所有日期内置闰年判断和无效日期过滤直接套模板。反转操作字符串用StringBuilder.reverse()List 用Collections.reverse()数组手动双指针交换。优先队列默认小根堆传入Collections.reverseOrder()转大根堆O (1) 获取最值。就到这了祝我们在学习算法的路上越来越顺比赛加油。诸位共勉无限学习