一、题目
给你一个数组 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)找到entryCollections.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()));// 将点过的菜记录进dishesNamefor (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)
