题目描述
Web系统通常会频繁地访问数据库,如果每次访问都创建新连接,性能会很差。为了提高性能,架构师决定复用已经创建的连接。当收到请求,并且连接池中没有剩余可用的连接时,系统会创建一个新连接,当请求处理完成时该连接会被放入连接池中,供后续请求使用。
现在提供你处理请求的日志,请你分析一下连接池最多需要创建多少个连接。
输入描述:
输入包含多组数据,每组数据第一行包含一个正整数n(1≤n≤1000),表示请求的数量。
紧接着n行,每行包含一个请求编号id(A、B、C……、Z)和操作结果(connect或disconnect)。
输出描述:
对应每一组数据,输出连接池最多需要创建多少个连接。
示例
输入
6
A connect
A disconnect
B connect
C connect
B disconnect
C disconnect
输出
2
解题思路
- 将输入的Id 和 op 依次存在数组v中,然后判断数组中的op,因为是依次存入的,所以op一定在数组的奇数位上,若op 是"connect" 则将op 前面的id 放入队列q中,否则先记录q 的长度,再将op前的id出队列。取得最长的长度即可。下面是实现的部分函数:
int Connect(vector<string> v)
{
int c = 0;
queue<string> q;
for (int i = 1; i<v.size(); i += 2)
{
if (v[i] == "connect")
q.push(v[i - 1]);
else{
c = q.size()>c ? q.size() : c;
q.pop();
}
}
return c;
}
- 直接判断输入时的第二个字符串,若第二个字符串是"connect" 则将输入的第一个字符串入队,否则就记录当前长度再出队,最后输出最长长度即可。这里比上面用vector简单一些,代码在下面:
完整代码
#include <iostream>
#include <string>
#include <queue>
using namespace std;
int main()
{
int n;
while (cin >> n)
{
int con = 0;
queue<char> q;
for (int i = 0; i<n; i++)
{
char ID;
cin >> ID;
string OP;
cin >> OP;
if (OP == "connect")
q.push(ID);
else
{
con = q.size()>con ? q.size() : con;
q.pop();
}
}
cout << con << endl;
}
return 0;
}
运行结果及讲解
原题链接:
https://www.nowcoder.com/questionTerminal/05f97d9b29944c018578d98d7f0ce56e