一套订货系统

solve actually problem!

需要实现一个订货系统,需要提供订货、发货、查询的基本功能。

  • 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;
};