一、Problem
給你一個數組 orders,表示客戶在餐廳中完成的訂單,確切地說, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客戶的姓名,tableNumberi 是客戶所在餐桌的桌號,而 foodItemi 是客戶點的餐品名稱。
請你返回該餐廳的 點菜展示表 。在這張表中,表中第一行爲標題,其第一列爲餐桌桌號 “Table” ,後面每一列都是按字母順序排列的餐品名稱。接下來每一行中的項則表示每張餐桌訂購的相應餐品數量,第一列應當填對應的桌號,後面依次填寫下單的餐品數量。
注意:客戶姓名不是點菜展示表的一部分。此外,表中的數據行應該按餐桌桌號升序排列。
輸入:
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"
二、Solution
方法一:Map + TreeSet
這種問題,看起來會很亂,我覺得還是兩步:
- 整理信息,比如我需要返回什麼,題目給我什麼。
- 把用到的字段的類型理一下,不求快但求穩。
比如這題:
- 我要存儲並排序餐桌編號 tID,以及菜名 name,還有每道菜的被點數 cnt;
- 答案的第一行是表格的首部:table + 全部排好序的菜名
- 第二行對應的是:餐桌 id + 菜的被點數
class Solution {
public List<List<String>> displayTable(List<List<String>> os) {
Map<Integer, Map<String, Integer>> mp = new HashMap<>();
Set<Integer> tIDs = new TreeSet<>();
Set<String> food = new TreeSet<>();
for (List<String> o : os) {
int tId = Integer.parseInt(o.get(1));
String name = o.get(2);
Map<String, Integer> m = mp.computeIfAbsent(tId, v -> new HashMap<>());
m.put(name, m.getOrDefault(name, 0) + 1);
tIDs.add(tId);
food.add(name);
}
List<List<String>> ans = new LinkedList<>();
List<String> t = new LinkedList<>();
t.add("Table");
t.addAll(food);
ans.add(t);
for (int tID : tIDs) {
List<String> l = new LinkedList<>();
l.add(tID+"");
for (String name : food)
l.add(mp.get(tID).getOrDefault(name, 0)+"");
ans.add(l);
}
return ans;
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度: