首先,由于自己平时都在写C++,对于Java来说,很多内容其实是不熟悉的,所以想总结一下一些内容。如果你对Java的理解不是很深并且想参加蓝桥杯,那么我觉得这篇博客能够给你带来帮助。
一. Java基础
1. 重载比较器
重载比较器是很重要的内容,调整排序的内容,能够完成很多题目。
这里给出我比较喜欢的写法:重载Comparable 接口
class node implements Comparable<node>{
int x,y;
public node(int x, int y) {
this.x = x;
this.y = y;
}
public int compareTo(node another) {
if(this.x == another.x) return this.y - another.y; //按y升序排序
return this.x - another.x; //按x升序排序
}
}
2. 容器
这里给出 Java 中的 HashMap 的用法,类似的 HashSet / Queue 等等都要会用,如果忘了可以现场查 API 文档,但是这样速度就慢了,所以还是熟练点好。
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
map.isEmpty() //返回bool 查看map是否为空
map.containsKey(x) //返回bool 查看map中是否有x健
map.containsValue(x) //返回bool 查看map中是否有x值
map.put(x, k); // 给x初始值k 重复时为覆盖
map.putAll(mp); // 把mp的键值对复制给map
map.get(x); // 获取x的对应的值
map.remove(x) // 移除键为x的键值对
map.clear() // 清空map
for(int u : map.values() ) // 遍历map的元素集
for(int v : map.keySet() ) // 遍历map的键值对集
for(Entry<Integer, Integer> entry : map.entrySet()) // 遍历map
for(Map.Entry<Integer,Integer> x: list)
x.getValue() / x.getKey()
map.put(s, (map.get(s) == null ? 1 : map.get(s) + 1)); //累加
3. 字符串处理
首先是字符的接收,这个估计有部分新手是不会的。
char c = cin.next().charAt(0)
其次是关于 String 和 StringBuffer 的内容。
String 的 equals 方法因为重写了 Object 的 equals 方法,所以可以比较字符串的内容,而 StringBuffer 因为没重写 equals 方法,直接继承了 Object 的 equals 方法,所以不行。
顺便提一句: String 因为是 final 类型的,是不可变类,所以对于 append 等操作,是要重新 new String 的,而 StringBuffer 是可变类,不需要重新 new StringBuffer,所以在字符串操作上性能非常好,而且好的不是一点点。
String s= new StringBuilder(String.valueOf(x)).reverse().toString();
return s.equals(String.valueOf(x));
二. 算法
1. 前向星
对于蓝桥杯来说,需要用到的算法并不多,但是关于图的题有几率会出现,所以感觉掌握前向星建图还是有必要的。
import java.util.Arrays;
import java.util.Scanner;
class node{
int v, next, w;
public node(int v, int w, int next) {
this.v = v;
this.next = next;
this.w = w;
}
}
public class Main {
static int N = 1000000 + 5;
static int head[] = new int[N << 1];
static node a[] = new node[N << 1];
static int k = 0, ans = 0;
static void add(int u, int v, int w) {
++k;
a[k] = new node(v, w, head[u]);
head[u] = k;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
int n = cin.nextInt();
for(int i = 2; i <= n; i++) {
int u = cin.nextInt(), v = cin.nextInt(), w = cin.nextInt();
add(u, v, w);
add(v, u, w);
}
}
}
2. DFS
这个算法是必须掌握的,特别是全排列,推荐去刷 leetcode 的与全排列相关的题,刷完差不多就领悟到精髓了。
3. BFS
BFS 和 DFS 是蓝桥杯中最常见的算法,所以这个也是必须要会的,推荐用 BFS 去写迷宫相关的题目和二叉树的遍历题目,写到有所领悟就行。
4. 动态规划
动态规划是很重要的内容,在这次比赛里面我印象深刻的是用三维 dp 写了一道编程题,估计就是凭借这道题博得的国一,这里我推荐去刷洛谷的相关题目。
5. 数论
关于数论的话其实是很巧妙的,我个人觉得只要掌握唯一分解定理就够了。在这次比赛里填空题就出了一道求约数个数的题目,其实就是把每个数分解后算每个质数对答案的贡献而已。当然,数论的其他内容也不错,但是对于我来说并不是很熟悉,像欧拉定理,像中国定理…数论的话推荐多做点题,然后自己多推一些公式,然后就差不多了,学会这些的话其实对提升自己的思维也是有所帮助的。
三. 注意事项
Java 组的编程题记得写 Main
C++ 组的编程题记得写 return 0
不要慌!成绩没出来就是有机会的!