如何準備藍橋杯

江先生的故事發表於2020-11-15

首先,由於自己平時都在寫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
不要慌!成績沒出來就是有機會的!