STL中有很多已经封装好了的数据结构,能够熟练掌握并使用他们能够为我们解决问题带来极大的便利,今天刷leetcode就遇到了一个类似的情况。
题目描述:
给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。
请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
第一,分析题目的所要结果,最后有两个排序:一个是table 一个是餐品名称,看到排序,STL中就有set,餐品名称不仅要排序,而且要去重,而且与table关联。所以基本思路如下
- 标题行包含:Table, food1, food2, ...
- 首先需要一个 set<string> foodList 保存所有餐品名称
- 然后还需要一个按照桌子保存的 map<int, map<string, int>> tableList
- 即:map<桌号,map<餐品名称,数量>>
- 将输入按照这个格式存储
- 转成输出格式
vector<vector<string>> displayTable(vector<vector<string>>& orders)
{
set<string> foodList;
map<int, map<string, int>> tableList;
for (auto& o : orders)
{
foodList.insert(o[2]);
tableList[stoi(o[1])][o[2]]++;
}
vector<vector<string>> ans;
vector<string> title = { "Table" };
for (auto& s : foodList)
{
title.push_back(s);
}
ans.push_back(title);
for (auto& p : tableList)
{
vector<string> t = { to_string(p.first) };
for (auto& s : foodList)
{
t.push_back(to_string(p.second[s]));
}
ans.push_back(t);
}
return ans;
}