一套订货系统
in Algorithm Pageviews
需要实现一个订货系统,需要提供订货、发货、查询的基本功能。
OrderSystem() - 系统初始化
Order(int customerId, const vector<string> &goods) - 表示某客户的一次订货,
goods
每个元素表示一件商品,值为商品种类:同一客户可以多次订货,单次订货,可对同一种类商品订购多件。
Deliver(const vector<string> &goods) - 表示发货多件商品,
goods
含义同上:每个元素表示一件商品,值为商品种类依次将每件商品按照订购的先后顺序发给订购这件商品的客户。
注:用例保证发的商品一定被某客户订购过
Query() - 查询并返回系统中未发货件数最大的客户Id,若存在并列,返回客户Id最小的;若所有客户都完成发货,返回 -1。
输入
每行表示一个函数调用,初始化函数仅首行调用一次,累计函数调用不超过1000次。
1 <= customerId <= 1000,1 <= goods.size() <= 1000,1 <= goods[i].size() <= 10
输出
按照顺序输出每个函数的执行结果。注:无返回结果的函数,框架自动输出字符串 “null”
样例
输入样例
OrderSystem()
Order(99, [“gd1000”])
Order(88, [“gd666”, “gd555”])
Order(99, [“gd666”])
Query()
Deliver([“gd666”])
Query()
输出样例
null
null
null
null
88
null
99
提示
- 第一次Query时,客户99与客户88的未发货件数都是2,返回客户Id较小的88
- 客户88先订货商品gd666,所以Deliver([“gd666”])发货给客户88。第二次Query时,客户88与客户99的未发货件数分别是1和2,因此返回99。
代码实现如下
#include <bits/stdc++.h>
using namespace std;
class OrderSystem {
public:
OrderSystem() {}
void Order(int customerId, const vector<string> &goods)
{
for (int i = 0; i < goods.size(); i++) {
orderMap[goods[i]].emplace(customerId);
}
}
void Deliver(const vector<string> &goods)
{
for (const auto &good : goods) {
orderMap[good].pop();
}
}
int Query()
{
map<int, int> customer;
for (const auto &good : orderMap) {
while (!good.second.empty()) {
auto custId = good.second.front();
++customer[custId];
good.second.pop();
}
}
if (customer.empty()) {
return -1;
}
return max_element(customer.begin(), customer.end(),
[](const pair<int, int> &a, const pair<int, int> &b) {
return a.second < b.second;
})->first;
}
private:
unordered_map<string, queue<int>> orderMap;
};