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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章