题目链接:https://leetcode-cn.com/problems/display-table-of-food-orders-in-a-restaurant/
题目描述
给你一个数组 orders
,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi]
,其中 customerNamei
是客户的姓名,tableNumberi
是客户所在餐桌的桌号,而 foodItemi
是客户点的餐品名称。
请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
示例1:
输入: orders = [[“David”,“3”,“Ceviche”],[“Corina”,“10”,“Beef Burrito”],[“David”,“3”,“Fried Chicken”],[“Carla”,“5”,“Water”],[“Carla”,“5”,“Ceviche”],[“Rous”,“3”,“Ceviche”]]
输出: [[“Table”,“Beef Burrito”,“Ceviche”,“Fried Chicken”,“Water”],[“3”,“0”,“2”,“1”,“0”],[“5”,“0”,“1”,“0”,“1”],[“10”,“1”,“0”,“0”,“0”]]
解释: 点菜展示表如下所示:
Table,Beef Burrito,Ceviche,Fried Chicken,Water
3 ,0 ,2 ,1 ,0
5 ,0 ,1 ,0 ,1
10 ,1 ,0 ,0 ,0
对于餐桌 3:David 点了 “Ceviche” 和 “Fried Chicken”,而 Rous 点了 “Ceviche”
而餐桌 5:Carla 点了 “Water” 和 “Ceviche”
餐桌 10:Corina 点了 “Beef Burrito”
示例2:
输入: orders = [[“James”,“12”,“Fried Chicken”],[“Ratesh”,“12”,“Fried Chicken”],[“Amadeus”,“12”,“Fried Chicken”],[“Adam”,“1”,“Canadian Waffles”],[“Brianna”,“1”,“Canadian Waffles”]]
输出: [[“Table”,“Canadian Waffles”,“Fried Chicken”],[“1”,“2”,“0”],[“12”,“0”,“3”]]
解释: 对于餐桌 1:Adam 和 Brianna 都点了 “Canadian Waffles”
而餐桌 12:James, Ratesh 和 Amadeus 都点了 “Fried Chicken”
示例3:
输入: orders = [[“Laura”,“2”,“Bean Burrito”],[“Jhon”,“2”,“Beef Burrito”],[“Melissa”,“2”,“Soda”]]
输出:[[“Table”,“Bean Burrito”,“Beef Burrito”,“Soda”],[“2”,“1”,“1”,“1”]]
思路
- 考察对数据结构的掌控和代码能力
- 一开始的思路可能会是先构造好展示表
ans
的横纵标题,比如示例一的Table,Beef Burrito,Ceviche,Fried Chicken,Water
和3,5,10
,然后通过横纵标题来在orders
数组中查询是否存在该条目,比如orders
中是否存在有3号桌上点过Ceviche
的条目,如果有就记录+1,直到遍历完整个orders
数组,然后将该记录值记录在当前展示表ans
的位置上。 - 以上的思路的问题是,在展示表的每个待记录的位置上,都需要遍历一遍
orders
数组,达到的O(n^3)的时间复杂度级别,效率随着数据量的增加大大降低。 - 因此可以考虑到使用哈希表
dishToId
来记录orders
数组,构造一个映射,其键值是桌号Table
,然后每个键值又对应一个哈希表,该哈希表的键值是餐品名称,其对应的值是该餐品的出现次数。 - 这样的话每次查询当前的横纵标题是否存在该条目,直接查该哈希表即可,效率是O(1),整体算法效率可达O(n^2)
代码如下:
class Solution {
public:
vector<vector<string>> displayTable(vector<vector<string>>& orders) {
vector<vector<string>> ans;
vector<string> headline;
headline.push_back("Table");
map<int, map<string, int>> dishToId;
set<string> dish;
for(auto o : orders) {
dish.insert(o[2]);
dishToId[stoi(o[1])][o[2]]++;
}
for(auto d : dish)
headline.push_back(d);
ans.push_back(headline);
for(int i = 0; i < dishToId.size(); i++) {
vector<string> temp(headline.size());
ans.push_back(temp);
}
int s = 1;
for(auto id : dishToId) {
ans[s++][0] = to_string(id.first);
}
for(int i = 1; i < ans.size(); ++i) {
int n = stoi(ans[i][0]);
for(int j = 1; j < headline.size(); ++j) {
string m = ans[0][j];
if(dishToId[n].find(m) != dishToId[n].end())
ans[i][j] = to_string(dishToId[n][m]);
else ans[i][j] = "0";
}
}
return ans;
}
};