题目描述:
题目链接:数据库连接池__牛客网
Web系统通常会频繁地访问数据库,如果每次访问都创建新连接,性能会很差。为了提高性能,架构师决定复用已经创建的连接。当收到请求,并且连接池中没有剩余可用的连接时,系统会创建一个新连接,当请求处理完成时该连接会被放入连接池中,供后续请求使用。现在提供你处理请求的日志,请你分析一下连接池最多需要创建多少个连接。
输入描述:
输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤1000),表示请求的数量。 紧接着n行,每行包含一个请求编号id(A、B、C……、Z)和操作(connect或disconnect)。
输出描述:
对应每一组数据,输出连接池最多需要创建多少个连接。
示例1
输入
6 A connect A disconnect B connect C connect B disconnect C disconnect输出
2
题目理解:
每次访问数据库就要建立一个连接,请问过程中最多建立了多少个连接?题目不难,思路也容易形成,但有几个小细节需要注意,不然也会卡一会儿。 一个是输入的 n 个 id 和 操作符,应该用什么存储,又如何拿出? 另一个是 参照id 的情况下,如何得到连接的最大值?
思路讲解:
本题解题,采用了两个巧思路,一个是 再循环里面接收输入的 id 和 操作符,这样输入一个处理一个,就不用数据结构去存储了。还有个巧思路是 同一个id 在没有断开的情况下,下一次出现的一定是断开,它不会重复连接(有了这个前提,就不用区分id了),我们就可以无脑加减一个变量, 遇见 connect 就是 加 1 ,遇见disconnect 就是 减 1 ,用另外一个变量记录过程中的最大值就好了。
提示一下,另一种思路是 ,用 HashSet 结构存储这个 id 值, 在过程中,遇见 connect 就是 加 1 ,遇见disconnect 就是 减 1,用另外一个变量记录过程中,set的最大 size 就好了。
代码注释:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNextInt()){
int count =0;
int n = scan.nextInt();
int max =0;
for(int i =0;i< n;i++){
String id = scan.next();
String op = scan.next();
if(op.equals("connect")){
count++;
}else{
count--;
}
max = Math.max(max,count);
}
System.out.println(max);
}
}
}