題目鏈接: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,Water
和3,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;
}
};