LeetCode - 点菜展示表

题目链接:https://leetcode-cn.com/problems/display-table-of-food-orders-in-a-restaurant/

题目描述

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

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

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

示例1:

输入: 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”

示例2:

输入: 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”

示例3:

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

思路

  • 考察对数据结构的掌控和代码能力
  • 一开始的思路可能会是先构造好展示表ans的横纵标题,比如示例一的Table,Beef Burrito,Ceviche,Fried Chicken,Water3,5,10,然后通过横纵标题来在orders数组中查询是否存在该条目,比如orders中是否存在有3号桌上点过Ceviche的条目,如果有就记录+1,直到遍历完整个orders数组,然后将该记录值记录在当前展示表ans的位置上。
  • 以上的思路的问题是,在展示表的每个待记录的位置上,都需要遍历一遍orders数组,达到的O(n^3)的时间复杂度级别,效率随着数据量的增加大大降低。
  • 因此可以考虑到使用哈希表dishToId来记录orders数组,构造一个映射,其键值是桌号Table,然后每个键值又对应一个哈希表,该哈希表的键值是餐品名称,其对应的值是该餐品的出现次数。
  • 这样的话每次查询当前的横纵标题是否存在该条目,直接查该哈希表即可,效率是O(1),整体算法效率可达O(n^2)

代码如下:

class Solution {
public:
    vector<vector<string>> displayTable(vector<vector<string>>& orders) {
        vector<vector<string>> ans;
        vector<string> headline;
        headline.push_back("Table");       
        map<int, map<string, int>> dishToId;
        set<string> dish;
        for(auto o : orders) {
            dish.insert(o[2]); 
            dishToId[stoi(o[1])][o[2]]++;
        } 
        for(auto d : dish) 
            headline.push_back(d);
        ans.push_back(headline);
        for(int i = 0; i < dishToId.size(); i++) {
            vector<string> temp(headline.size());
            ans.push_back(temp);
        }
        int s = 1;
        for(auto id : dishToId) {
            ans[s++][0] = to_string(id.first);
        }  
        for(int i = 1; i < ans.size(); ++i) {
            int n = stoi(ans[i][0]);
            for(int j = 1; j < headline.size(); ++j) {
                string m = ans[0][j];
                if(dishToId[n].find(m) != dishToId[n].end())
                    ans[i][j] = to_string(dishToId[n][m]);
                else ans[i][j] = "0";
            }
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章