LC1418-点菜展示表

159 阅读2分钟

题目名称:点菜展示表

给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。

请你返回该餐厅的 点菜展示表 在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。

注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。

示例 1:

输入: orders = [["James","12","Fried Chicken"],["Ratesh","12","Fried Chicken"],["Amadeus","12","Fried Chicken"],["Adam","1","Canadian Waffles"],["Brianna","1","Canadian Waffles"]]
输出: [["Table","Canadian Waffles","Fried Chicken"],["1","2","0"],["12","0","3"]] 
解释:
对于餐桌 1:Adam 和 Brianna 都点了 "Canadian Waffles"
而餐桌 12:James, Ratesh 和 Amadeus 都点了 "Fried Chicken"

示例 2:

输入: orders = [["Laura","2","Bean Burrito"],["Jhon","2","Beef Burrito"],["Melissa","2","Soda"]]
输出: [["Table","Bean Burrito","Beef Burrito","Soda"],["2","1","1","1"]]

提示:

  • 1<= orders.length<=51041 <= orders.length <= 5 * 10^4
  • orders[i].length == 3
  • 1 <= customerNamei.length, foodItemi.length <= 20
  • customerNamei 和 foodItemi 由大小写英文字母及空格字符 ' ' 组成。
  • tableNumberi 是 1 到 500 范围内的整数。

思路分析

分析题目,第一行为菜名,需要单独进行存储。考虑到菜名的特点,选择使用数据结构TreeSet用于存储菜名,既能保证菜名的唯一性,又能让菜名按照字母序进行排序。

细心的分析题目可以发现,其实人名是多余数据,我们不用关心是谁点的菜。我们只需要统计每个餐桌上点的菜品数量即可。因为又考虑到要按照餐桌桌号排序,因此选择使用TreeMap的数据结构,可以给键值自动排序,键为桌号。

分析至此,只需要利用好着两个TreeSet、TreeMap这两个数据结构

Code实现

public List < List < String >> displayTable(List < List < String >> orders) {
    TreeSet < String > meals = new TreeSet < > (); //用于存储菜名
    //用于存储每个桌上出现的菜品,以及对应的数量
    TreeMap < Integer, HashMap < String, Integer >> tm = new TreeMap < > ();
    // 初始化
    for (List < String > order: orders) {
        meals.add(order.get(2));
        HashMap < String, Integer > mealMap = tm.getOrDefault(Integer.valueOf(order.get(1)), new HashMap < > ());
        int num = mealMap.getOrDefault(order.get(2), 0) + 1;
        mealMap.put(order.get(2), num);
        tm.put(Integer.valueOf(order.get(1)), mealMap);
    }
    // 初始化点菜展示表的第一行菜单名
    List < String > head = new ArrayList < > ();
    head.add("Table");
    for (String meal: meals) {
        head.add(meal);
    }
    List < List < String >> res = new ArrayList < > ();
    res.add(head);
    Set < Map.Entry < Integer, HashMap < String, Integer >>> entries = tm.entrySet();
    for (Map.Entry < Integer, HashMap < String, Integer >> entry: entries) {
        List < String > list = new ArrayList < > ();
        list.add(entry.getKey().toString());
        for (String meal: meals) { //依次按照列名遍历Map,获取菜的数量
            String s = entry.getValue().getOrDefault(meal, 0).toString();
            list.add(s);
        }
        res.add(list);
    }
    return res;
}

结果

Snipaste_2023-05-05_23-44-50.png

算法复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)