33
33
<p ><strong >示例 1:</strong ></p >
34
34
35
35
<pre ><strong >输入:</strong >orders = [[" ; David" ; ," ; 3" ; ," ; Ceviche" ; ],[" ; Corina" ; ," ; 10" ; ," ; Beef Burrito" ; ],[" ; David" ; ," ; 3" ; ," ; Fried Chicken" ; ],[" ; Carla" ; ," ; 5" ; ," ; Water" ; ],[" ; Carla" ; ," ; 5" ; ," ; Ceviche" ; ],[" ; Rous" ; ," ; 3" ; ," ; Ceviche" ; ]]
36
- <strong >输出:</strong >[[" ; Table" ; ," ; Beef Burrito" ; ," ; Ceviche" ; ," ; Fried Chicken" ; ," ; Water" ; ],[" ; 3" ; ," ; 0" ; ," ; 2" ; ," ; 1" ; ," ; 0" ; ],[" ; 5" ; ," ; 0" ; ," ; 1" ; ," ; 0" ; ," ; 1" ; ],[" ; 10" ; ," ; 1" ; ," ; 0" ; ," ; 0" ; ," ; 0" ; ]]
36
+ <strong >输出:</strong >[[" ; Table" ; ," ; Beef Burrito" ; ," ; Ceviche" ; ," ; Fried Chicken" ; ," ; Water" ; ],[" ; 3" ; ," ; 0" ; ," ; 2" ; ," ; 1" ; ," ; 0" ; ],[" ; 5" ; ," ; 0" ; ," ; 1" ; ," ; 0" ; ," ; 1" ; ],[" ; 10" ; ," ; 1" ; ," ; 0" ; ," ; 0" ; ," ; 0" ; ]]
37
37
<strong >解释:
38
38
</strong >点菜展示表如下所示:
39
39
<strong >Table,Beef Burrito,Ceviche,Fried Chicken,Water</strong >
@@ -42,13 +42,13 @@ tags:
42
42
10 ,1 ,0 ,0 ,0
43
43
对于餐桌 3:David 点了 " ; Ceviche" ; 和 " ; Fried Chicken" ; ,而 Rous 点了 " ; Ceviche" ;
44
44
而餐桌 5:Carla 点了 " ; Water" ; 和 " ; Ceviche" ;
45
- 餐桌 10:Corina 点了 " ; Beef Burrito" ;
45
+ 餐桌 10:Corina 点了 " ; Beef Burrito" ;
46
46
</pre >
47
47
48
48
<p ><strong >示例 2:</strong ></p >
49
49
50
50
<pre ><strong >输入:</strong >orders = [[" ; James" ; ," ; 12" ; ," ; Fried Chicken" ; ],[" ; Ratesh" ; ," ; 12" ; ," ; Fried Chicken" ; ],[" ; Amadeus" ; ," ; 12" ; ," ; Fried Chicken" ; ],[" ; Adam" ; ," ; 1" ; ," ; Canadian Waffles" ; ],[" ; Brianna" ; ," ; 1" ; ," ; Canadian Waffles" ; ]]
51
- <strong >输出:</strong >[[" ; Table" ; ," ; Canadian Waffles" ; ," ; Fried Chicken" ; ],[" ; 1" ; ," ; 2" ; ," ; 0" ; ],[" ; 12" ; ," ; 0" ; ," ; 3" ; ]]
51
+ <strong >输出:</strong >[[" ; Table" ; ," ; Canadian Waffles" ; ," ; Fried Chicken" ; ],[" ; 1" ; ," ; 2" ; ," ; 0" ; ],[" ; 12" ; ," ; 0" ; ," ; 3" ; ]]
52
52
<strong >解释:</strong >
53
53
对于餐桌 1:Adam 和 Brianna 都点了 " ; Canadian Waffles" ;
54
54
而餐桌 12:James, Ratesh 和 Amadeus 都点了 " ; Fried Chicken" ;
78
78
79
79
<!-- solution:start -->
80
80
81
- ### 方法一
81
+ ### 方法一:哈希表 + 排序
82
+
83
+ 我们可以用一个哈希表 $\textit{tables}$ 来存储每张餐桌点的菜品,用一个集合 $\textit{items}$ 来存储所有的菜品。
84
+
85
+ 遍历 $\textit{orders}$,将每张餐桌点的菜品存入 $\textit{tables}$ 和 $\textit{items}$ 中。
86
+
87
+ 然后我们将 $\textit{items}$ 排序,得到 $\textit{sortedItems}$。
88
+
89
+ 接下来,我们构建答案数组 $\textit{ans}$,首先将标题行 $\textit{header}$ 加入 $\textit{ans}$,然后遍历排序后的 $\textit{tables}$,对于每张餐桌,我们用一个计数器 $\textit{cnt}$ 来统计每种菜品的数量,然后构建一行 $\textit{row}$,将其加入 $\textit{ans}$。
90
+
91
+ 最后返回 $\textit{ans}$。
92
+
93
+ 时间复杂度 $O(n + m \times \log m + k \times \log k + m \times k)$,空间复杂度 $O(n + m + k)$。其中 $n$ 是数组 $\textit{orders}$ 的长度,而 $m$ 和 $k$ 分别表示菜品种类数和餐桌数。
82
94
83
95
<!-- tabs:start -->
84
96
@@ -87,58 +99,53 @@ tags:
87
99
``` python
88
100
class Solution :
89
101
def displayTable (self , orders : List[List[str ]]) -> List[List[str ]]:
90
- tables = set ()
91
- foods = set ()
92
- mp = Counter()
93
- for _, table, food in orders:
94
- tables.add(int (table))
95
- foods.add(food)
96
- mp[f ' { table} . { food} ' ] += 1
97
- foods = sorted (list (foods))
98
- tables = sorted (list (tables))
99
- res = [[' Table' ] + foods]
100
- for table in tables:
101
- t = [str (table)]
102
- for food in foods:
103
- t.append(str (mp[f ' { table} . { food} ' ]))
104
- res.append(t)
105
- return res
102
+ tables = defaultdict(list )
103
+ items = set ()
104
+ for _, table, foodItem in orders:
105
+ tables[int (table)].append(foodItem)
106
+ items.add(foodItem)
107
+ sorted_items = sorted (items)
108
+ ans = [[" Table" ] + sorted_items]
109
+ for table in sorted (tables):
110
+ cnt = Counter(tables[table])
111
+ row = [str (table)] + [str (cnt[item]) for item in sorted_items]
112
+ ans.append(row)
113
+ return ans
106
114
```
107
115
108
116
#### Java
109
117
110
118
``` java
111
119
class Solution {
112
120
public List<List<String > > displayTable (List<List<String > > orders ) {
113
- Set<Integer > tables = new HashSet<> ();
114
- Set<String > foods = new HashSet<> ();
115
- Map<String , Integer > mp = new HashMap<> ();
116
- for (List<String > order : orders) {
117
- int table = Integer . parseInt(order. get(1 ));
118
- String food = order. get(2 );
119
- tables. add(table);
120
- foods. add(food);
121
- String key = table + " ." + food;
122
- mp. put(key, mp. getOrDefault(key, 0 ) + 1 );
121
+ TreeMap<Integer , List<String > > tables = new TreeMap<> ();
122
+ Set<String > items = new HashSet<> ();
123
+ for (List<String > o : orders) {
124
+ int table = Integer . parseInt(o. get(1 ));
125
+ String foodItem = o. get(2 );
126
+ tables. computeIfAbsent(table, k - > new ArrayList<> ()). add(foodItem);
127
+ items. add(foodItem);
123
128
}
124
- List<Integer > t = new ArrayList<> (tables);
125
- List<String > f = new ArrayList<> (foods);
126
- Collections . sort(t);
127
- Collections . sort(f);
128
- List<List<String > > res = new ArrayList<> ();
129
- List<String > title = new ArrayList<> ();
130
- title. add(" Table" );
131
- title. addAll(f);
132
- res. add(title);
133
- for (int table : t) {
134
- List<String > tmp = new ArrayList<> ();
135
- tmp. add(String . valueOf(table));
136
- for (String food : f) {
137
- tmp. add(String . valueOf(mp. getOrDefault(table + " ." + food, 0 )));
129
+ List<String > sortedItems = new ArrayList<> (items);
130
+ Collections . sort(sortedItems);
131
+ List<List<String > > ans = new ArrayList<> ();
132
+ List<String > header = new ArrayList<> ();
133
+ header. add(" Table" );
134
+ header. addAll(sortedItems);
135
+ ans. add(header);
136
+ for (Map . Entry<Integer , List<String > > entry : tables. entrySet()) {
137
+ Map<String , Integer > cnt = new HashMap<> ();
138
+ for (String item : entry. getValue()) {
139
+ cnt. merge(item, 1 , Integer :: sum);
140
+ }
141
+ List<String > row = new ArrayList<> ();
142
+ row. add(String . valueOf(entry. getKey()));
143
+ for (String item : sortedItems) {
144
+ row. add(String . valueOf(cnt. getOrDefault(item, 0 )));
138
145
}
139
- res . add(tmp );
146
+ ans . add(row );
140
147
}
141
- return res ;
148
+ return ans ;
142
149
}
143
150
}
144
151
```
@@ -149,36 +156,31 @@ class Solution {
149
156
class Solution {
150
157
public:
151
158
vector<vector<string >> displayTable(vector<vector<string >>& orders) {
152
- unordered_set<int > tables;
153
- unordered_set<string > foods;
154
- unordered_map<string, int> mp;
155
- for (auto& order : orders) {
156
- int table = stoi(order[ 1] );
157
- string food = order[ 2] ;
158
- tables.insert(table);
159
- foods.insert(food);
160
- ++mp[ order[ 1] + "." + food] ;
159
+ map<int, vector<string >> tables;
160
+ set<string > sortedItems;
161
+ for (auto& o : orders) {
162
+ int table = stoi(o[ 1] );
163
+ string foodItem = o[ 2] ;
164
+ tables[ table] .push_back(foodItem);
165
+ sortedItems.insert(foodItem);
161
166
}
162
- vector<int > t;
163
- t.assign(tables.begin(), tables.end());
164
- sort(t.begin(), t.end());
165
- vector<string > f;
166
- f.assign(foods.begin(), foods.end());
167
- sort(f.begin(), f.end());
168
- vector<vector<string >> res;
169
- vector<string > title;
170
- title.push_back("Table");
171
- for (auto e : f) title.push_back(e);
172
- res.push_back(title);
173
- for (int table : t) {
174
- vector<string > tmp;
175
- tmp.push_back(to_string(table));
176
- for (string food : f) {
177
- tmp.push_back(to_string(mp[ to_string(table) + "." + food] ));
167
+ vector<vector<string >> ans;
168
+ vector<string > header = {"Table"};
169
+ header.insert(header.end(), sortedItems.begin(), sortedItems.end());
170
+ ans.push_back(header);
171
+ for (auto& [ table, items] : tables) {
172
+ unordered_map<string, int> cnt;
173
+ for (string& item : items) {
174
+ cnt[ item] ++;
175
+ }
176
+ vector<string > row;
177
+ row.push_back(to_string(table));
178
+ for (const string& item : sortedItems) {
179
+ row.push_back(to_string(cnt[ item] ));
178
180
}
179
- res .push_back(tmp );
181
+ ans .push_back(row );
180
182
}
181
- return res ;
183
+ return ans ;
182
184
}
183
185
};
184
186
```
@@ -187,43 +189,74 @@ public:
187
189
188
190
```go
189
191
func displayTable(orders [][]string) [][]string {
190
- tables := make(map[int]bool)
191
- foods := make(map[string]bool)
192
- mp := make(map[string]int)
192
+ tables := make(map[int]map[string]int)
193
+ items := make(map[string]bool)
193
194
for _, order := range orders {
194
- table, food := order[1], order[2]
195
- t, _ := strconv.Atoi(table)
196
- tables[t] = true
197
- foods[food] = true
198
- key := table + "." + food
199
- mp[key] += 1
200
- }
201
- var t []int
202
- var f []string
203
- for i := range tables {
204
- t = append(t, i)
195
+ table, _ := strconv.Atoi(order[1])
196
+ foodItem := order[2]
197
+ if tables[table] == nil {
198
+ tables[table] = make(map[string]int)
199
+ }
200
+ tables[table][foodItem]++
201
+ items[foodItem] = true
205
202
}
206
- for i := range foods {
207
- f = append(f, i)
203
+ sortedItems := make([]string, 0, len(items))
204
+ for item := range items {
205
+ sortedItems = append(sortedItems, item)
208
206
}
209
- sort.Ints(t )
210
- sort.Strings(f)
211
- var res [][] string
212
- var title []string
213
- title = append(title, "Table" )
214
- for _, e := range f {
215
- title = append(title, e )
207
+ sort.Strings(sortedItems )
208
+ ans := [][]string{}
209
+ header := append([] string{"Table"}, sortedItems...)
210
+ ans = append(ans, header)
211
+ tableNums := make([]int, 0, len(tables) )
212
+ for table := range tables {
213
+ tableNums = append(tableNums, table )
216
214
}
217
- res = append(res, title )
218
- for _, table := range t {
219
- var tmp []string
220
- tmp = append(tmp, strconv.Itoa(table))
221
- for _, food := range f {
222
- tmp = append(tmp , strconv.Itoa(mp[strconv.Itoa(table)+"."+food] ))
215
+ sort.Ints(tableNums )
216
+ for _, table := range tableNums {
217
+ row := []string{strconv.Itoa(table)}
218
+ for _, item := range sortedItems {
219
+ count := tables[table][item]
220
+ row = append(row , strconv.Itoa(count ))
223
221
}
224
- res = append(res, tmp )
222
+ ans = append(ans, row )
225
223
}
226
- return res
224
+ return ans
225
+ }
226
+ ```
227
+
228
+ #### TypeScript
229
+
230
+ ``` ts
231
+ function displayTable(orders : string [][]): string [][] {
232
+ const tables: Record <number , Record <string , number >> = {};
233
+ const items: Set <string > = new Set ();
234
+ for (const [_, table, foodItem] of orders ) {
235
+ const t = + table ;
236
+ if (! tables [t ]) {
237
+ tables [t ] = {};
238
+ }
239
+ if (! tables [t ][foodItem ]) {
240
+ tables [t ][foodItem ] = 0 ;
241
+ }
242
+ tables [t ][foodItem ]++ ;
243
+ items .add (foodItem );
244
+ }
245
+ const sortedItems = Array .from (items ).sort ();
246
+ const ans: string [][] = [];
247
+ const header: string [] = [' Table' , ... sortedItems ];
248
+ ans .push (header );
249
+ const sortedTableNumbers = Object .keys (tables )
250
+ .map (Number )
251
+ .sort ((a , b ) => a - b );
252
+ for (const table of sortedTableNumbers ) {
253
+ const row: string [] = [table .toString ()];
254
+ for (const item of sortedItems ) {
255
+ row .push ((tables [table ][item ] || 0 ).toString ());
256
+ }
257
+ ans .push (row );
258
+ }
259
+ return ans ;
227
260
}
228
261
```
229
262
0 commit comments