【编程马拉松算法目录】
【021-数据库连接池】【工程下载>>>】
1 题目描述
Web系统通常会频繁地访问数据库,如果每次访问都创建新连接,性能会很差。为了提高性能,架构师决定复用已经创建的连接。当收到请求,并且连接池中没有剩余可用的连接时,系统会创建一个新连接,当请求处理完成时该连接会被放入连接池中,供后续请求使用。 现在提供你处理请求的日志,请你分析一下连接池最多需要创建多少个连接。
1.1 输入描述:
输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤1000),表示请求的数量。紧接着n行,每行包含一个请求编号id(A、B、C、……、Z)和操作(connect或disconnect)。
1.2 输出描述:
对应每一组数据,输出连接池最多需要创建多少个连接。
1.3 输入例子:
6
A connect
A disconnect
B connect
C connect
B disconnect
C disconnect
1.4 输出例子:
2
2 解题思路
此题比较简单,详见代码注释。
3 算法实现
import java.util.*;
/**
* Author: 王俊超
* Time: 2016-05-13 09:57
* CSDN: http://blog.csdn.net/derrantcm
* Github: https://github.com/Wang-Jun-Chao
* 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;
}
}
4 测试结果
5 其它信息
因为markddow不好编辑,因此将文档的图片上传以供阅读。Pdf和Word文档可以在Github上进行【下载>>>】。
时间: 2024-10-03 22:53:35