【設計】B005_LC_點菜展示表(Map + TreeSet)

一、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;
    }
}

複雜度分析

  • 時間複雜度:O(...)O(...)
  • 空間複雜度:O(...)O(...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章