链接
https://leetcode-cn.com/problems/display-table-of-food-orders-in-a-restaurant/
耗时
解题:1 h 24 min
题解:8 min
题意
给你一个数组 orders
,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi]
,其中 customerNamei
是客户的姓名,tableNumberi
是客户所在餐桌的桌号,而 foodItemi
是客户点的餐品名称。
请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
提示:
1 <= orders.length <= 5 * 10^4
orders[i].length == 3
1 <= customerNamei.length, foodItemi.length <= 20
-
customerNamei
和foodItemi
由大小写英文字母及空格字符' '
组成。 -
tableNumberi
是1
到500
范围内的整数。
思路
模拟题意即可,把所有的 桌号 和 菜名 去下重,使其唯一,再排序,然后按顺序编号,这样就有每个桌号和菜名对应的位置了,遍历orders按编号位置每次+1,最后顺序遍历计算好的矩阵做出题意要的 点菜展示表。
时间复杂度: O ( 5 ∗ 1 0 4 ∗ 500 ) O(5 * 10^4 * 500) O(5∗104∗500)
AC代码
class Solution {
public:
vector<vector<string>> displayTable(vector<vector<string>>& orders) {
// 用 set 去重 桌号 和 菜名
set<int> table_set;
set<string> food_set;
for(auto order : orders) {
string tableNumber = order[1];
string foodItem = order[2];
table_set.insert(stoi( tableNumber ));
food_set.insert(foodItem);
}
// 给 桌子 和 菜 一个编号
unordered_map<string, int> table_id, food_id;
int curr_table_id = 0, curr_food_id = 0;
for(auto tableNumber : table_set) {
table_id[to_string(tableNumber)] = curr_table_id;
curr_table_id++;
}
for(auto foodItem : food_set) {
food_id[foodItem] = curr_food_id;
curr_food_id++;
}
// 计算 每桌 每个菜 的数量
vector<vector<int>> cal_table(curr_table_id, vector<int>(curr_food_id, 0));
for(auto order : orders) {
string tableNumber = order[1];
string foodItem = order[2];
cal_table[table_id[tableNumber]][food_id[foodItem]]++;
}
// 制作 点菜展示表
vector<vector<string>> display_table(curr_table_id+1, vector<string>(curr_food_id+1, "0"));
display_table[0][0] = "Table";
int i = 1;
for(auto foodItem : food_set) {
display_table[0][i++] = foodItem;
}
i = 1;
for(auto tableNumber : table_set) {
display_table[i++][0] = to_string(tableNumber);
}
for(int i = 1; i <= curr_table_id; ++i) {
for(int j = 1; j <= curr_food_id; ++j) {
display_table[i][j] = to_string(cal_table[i-1][j-1]);
}
}
return display_table;
}
};