一、题目
给你一个数组 orders
,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi]
,其中 customerNamei
是客户的姓名,tableNumberi
是客户所在餐桌的桌号,而 foodItemi
是客户点的餐品名称。
请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table”
,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
点击查看原题
难度级别: 中等
二、思路
1)哈希表
三、代码
1)哈希表
class Solution {
public List<List<String>> displayTable(List<List<String>> orders) {
List<List<String>> ans = new ArrayList();
// 记录每张桌子id点的所有菜
Map<Integer, Map<String, Integer>> tableOrder = new HashMap(orders.size() * 2);
Map<String, Integer> dishesName = new HashMap(); // 记录出现过的所有菜名,后面可以使用其记录每一桌点菜数量
for (List<String> order : orders) { // 遍历并记录
int table = Integer.valueOf(order.get(1));
if (!tableOrder.containsKey(table)) {
tableOrder.put(table, new HashMap<String, Integer>());
}
if (!dishesName.containsKey(order.get(2))) {
dishesName.put(order.get(2), 0);
}
Map<String, Integer> booked = tableOrder.get(table);
booked.put(order.get(2), booked.getOrDefault(order.get(2), 0) + 1);
}
List<Map.Entry<Integer, Map<String, Integer>>> sortedTableOrder = new ArrayList(tableOrder.entrySet());
// 对每张桌子的订单进行排序,根据桌子id从小到大排列
Collections.sort(sortedTableOrder, (Map.Entry<Integer, Map<String, Integer>> m1, Map.Entry<Integer, Map<String, Integer>> m2) -> {
return m1.getKey() < m2.getKey() ? -1 : 1;
});
List<Map.Entry<String, Integer>> sortedDishesName = new ArrayList(dishesName.entrySet());
// 根据菜名进行排序,sortedDishesName拥有排序的entry,dishesName可以O(1)找到entry
Collections.sort(sortedDishesName, (Map.Entry<String, Integer> m1, Map.Entry<String, Integer> m2) -> {
return m1.getKey().compareTo(m2.getKey());
});
// 建立答案中第一行的菜名
List<String> firstRow = new ArrayList();
firstRow.add("Table");
for (Map.Entry<String, Integer> entry : sortedDishesName) {
firstRow.add(entry.getKey());
}
ans.add(firstRow);
for (Map.Entry<Integer, Map<String, Integer>> order : sortedTableOrder) {
List<String> temp = new ArrayList();
temp.add(String.valueOf(order.getKey()));
// 将点过的菜记录进dishesName
for (Map.Entry<String, Integer> dishes : order.getValue().entrySet()) {
dishesName.put(dishes.getKey(), dishes.getValue());
}
// 生成添加进答案的行
for (Map.Entry<String, Integer> entry : sortedDishesName) {
temp.add(String.valueOf(entry.getValue()));
}
// 清空dishesName中记录,便于做下一桌的记录
for (Map.Entry<String, Integer> entry : sortedDishesName) {
entry.setValue(0);
}
ans.add(temp);
}
return ans;
}
}
时间复杂度为O(),空间复杂度为O(n)