Web系統一般會頻繁地訪問數據庫,若是每次訪問都建立新鏈接,性能會不好。爲了提升性能,架構師決定複用已經建立的鏈接。當收到請求,而且鏈接池中沒有剩餘可用的鏈接時,系統會建立一個新鏈接,當請求處理完成時該鏈接會被放入鏈接池中,供後續請求使用。 如今提供你處理請求的日誌,請你分析一下鏈接池最多須要建立多少個鏈接。java
輸入包含多組數據,每組數據第一行包含一個正整數n(1≤n≤1000),表示請求的數量。緊接着n行,每行包含一個請求編號id(A、B、C、……、Z)和操做(connect或disconnect)。mysql
對應每一組數據,輸出鏈接池最多須要建立多少個鏈接。算法
6 A connect A disconnect B connect C connect B disconnect C disconnect
2
此題比較簡單,詳見代碼註釋。sql
import java.util.*; /** * Declaration: All Rights Reserved !!! */ public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNext()) { int n = scanner.nextInt(); n *= 2; List<String> request = new ArrayList<>(n); for (int i = 0; i < n; i++) { request.add(scanner.next()); } System.out.println(maxConnection(request)); } scanner.close(); } /** * 求最大的鏈接數 * * @param request 請求操做,兩個一組(a, b),a表示鏈接名稱,b表操做內容,connect或者disconnect * @return 最大的鏈接數 */ private static int maxConnection(List<String> request) { // 記錄最大的鏈接數 int max = 0; // 保存鏈接數 Set<String> conn = new HashSet<>(request.size() / 2); // 處理每個鏈接請求 for (int i = 0, j = request.size(); i < j; i += 2) { String r = request.get(i); String o = request.get(i + 1); // 若是是鏈接操做就添加到鏈接池中 if ("connect".equals(o)) { conn.add(r); // 當前鏈接池中的大小比以前記錄到的最大值還要大,就更新最大值 if (conn.size() > max) { max = conn.size(); } } // 刪除鏈接 else if ("disconnect".equals(o)) { conn.remove(r); } } return max; } }