diff --git a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README.md b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README.md
index e35ca074730dc..1a28d2ad9e55e 100644
--- a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README.md
+++ b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README.md
@@ -33,7 +33,7 @@ tags:
示例 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"]]
解释:
点菜展示表如下所示:
Table,Beef Burrito,Ceviche,Fried Chicken,Water
@@ -42,13 +42,13 @@ tags:
10 ,1 ,0 ,0 ,0
对于餐桌 3:David 点了 "Ceviche" 和 "Fried Chicken",而 Rous 点了 "Ceviche"
而餐桌 5:Carla 点了 "Water" 和 "Ceviche"
-餐桌 10:Corina 点了 "Beef Burrito"
+餐桌 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"]]
+输出:[["Table","Canadian Waffles","Fried Chicken"],["1","2","0"],["12","0","3"]]
解释:
对于餐桌 1:Adam 和 Brianna 都点了 "Canadian Waffles"
而餐桌 12:James, Ratesh 和 Amadeus 都点了 "Fried Chicken"
@@ -78,7 +78,19 @@ tags:
-### 方法一
+### 方法一:哈希表 + 排序
+
+我们可以用一个哈希表 $\textit{tables}$ 来存储每张餐桌点的菜品,用一个集合 $\textit{items}$ 来存储所有的菜品。
+
+遍历 $\textit{orders}$,将每张餐桌点的菜品存入 $\textit{tables}$ 和 $\textit{items}$ 中。
+
+然后我们将 $\textit{items}$ 排序,得到 $\textit{sortedItems}$。
+
+接下来,我们构建答案数组 $\textit{ans}$,首先将标题行 $\textit{header}$ 加入 $\textit{ans}$,然后遍历排序后的 $\textit{tables}$,对于每张餐桌,我们用一个计数器 $\textit{cnt}$ 来统计每种菜品的数量,然后构建一行 $\textit{row}$,将其加入 $\textit{ans}$。
+
+最后返回 $\textit{ans}$。
+
+时间复杂度 $O(n + m \times \log m + k \times \log k + m \times k)$,空间复杂度 $O(n + m + k)$。其中 $n$ 是数组 $\textit{orders}$ 的长度,而 $m$ 和 $k$ 分别表示菜品种类数和餐桌数。
@@ -87,22 +99,18 @@ tags:
```python
class Solution:
def displayTable(self, orders: List[List[str]]) -> List[List[str]]:
- tables = set()
- foods = set()
- mp = Counter()
- for _, table, food in orders:
- tables.add(int(table))
- foods.add(food)
- mp[f'{table}.{food}'] += 1
- foods = sorted(list(foods))
- tables = sorted(list(tables))
- res = [['Table'] + foods]
- for table in tables:
- t = [str(table)]
- for food in foods:
- t.append(str(mp[f'{table}.{food}']))
- res.append(t)
- return res
+ tables = defaultdict(list)
+ items = set()
+ for _, table, foodItem in orders:
+ tables[int(table)].append(foodItem)
+ items.add(foodItem)
+ sorted_items = sorted(items)
+ ans = [["Table"] + sorted_items]
+ for table in sorted(tables):
+ cnt = Counter(tables[table])
+ row = [str(table)] + [str(cnt[item]) for item in sorted_items]
+ ans.append(row)
+ return ans
```
#### Java
@@ -110,35 +118,34 @@ class Solution:
```java
class Solution {
public List> displayTable(List> orders) {
- Set tables = new HashSet<>();
- Set foods = new HashSet<>();
- Map mp = new HashMap<>();
- for (List order : orders) {
- int table = Integer.parseInt(order.get(1));
- String food = order.get(2);
- tables.add(table);
- foods.add(food);
- String key = table + "." + food;
- mp.put(key, mp.getOrDefault(key, 0) + 1);
+ TreeMap> tables = new TreeMap<>();
+ Set items = new HashSet<>();
+ for (List o : orders) {
+ int table = Integer.parseInt(o.get(1));
+ String foodItem = o.get(2);
+ tables.computeIfAbsent(table, k -> new ArrayList<>()).add(foodItem);
+ items.add(foodItem);
}
- List t = new ArrayList<>(tables);
- List f = new ArrayList<>(foods);
- Collections.sort(t);
- Collections.sort(f);
- List> res = new ArrayList<>();
- List title = new ArrayList<>();
- title.add("Table");
- title.addAll(f);
- res.add(title);
- for (int table : t) {
- List tmp = new ArrayList<>();
- tmp.add(String.valueOf(table));
- for (String food : f) {
- tmp.add(String.valueOf(mp.getOrDefault(table + "." + food, 0)));
+ List sortedItems = new ArrayList<>(items);
+ Collections.sort(sortedItems);
+ List> ans = new ArrayList<>();
+ List header = new ArrayList<>();
+ header.add("Table");
+ header.addAll(sortedItems);
+ ans.add(header);
+ for (Map.Entry> entry : tables.entrySet()) {
+ Map cnt = new HashMap<>();
+ for (String item : entry.getValue()) {
+ cnt.merge(item, 1, Integer::sum);
+ }
+ List row = new ArrayList<>();
+ row.add(String.valueOf(entry.getKey()));
+ for (String item : sortedItems) {
+ row.add(String.valueOf(cnt.getOrDefault(item, 0)));
}
- res.add(tmp);
+ ans.add(row);
}
- return res;
+ return ans;
}
}
```
@@ -149,36 +156,31 @@ class Solution {
class Solution {
public:
vector> displayTable(vector>& orders) {
- unordered_set tables;
- unordered_set foods;
- unordered_map mp;
- for (auto& order : orders) {
- int table = stoi(order[1]);
- string food = order[2];
- tables.insert(table);
- foods.insert(food);
- ++mp[order[1] + "." + food];
+ map> tables;
+ set sortedItems;
+ for (auto& o : orders) {
+ int table = stoi(o[1]);
+ string foodItem = o[2];
+ tables[table].push_back(foodItem);
+ sortedItems.insert(foodItem);
}
- vector t;
- t.assign(tables.begin(), tables.end());
- sort(t.begin(), t.end());
- vector f;
- f.assign(foods.begin(), foods.end());
- sort(f.begin(), f.end());
- vector> res;
- vector title;
- title.push_back("Table");
- for (auto e : f) title.push_back(e);
- res.push_back(title);
- for (int table : t) {
- vector tmp;
- tmp.push_back(to_string(table));
- for (string food : f) {
- tmp.push_back(to_string(mp[to_string(table) + "." + food]));
+ vector> ans;
+ vector header = {"Table"};
+ header.insert(header.end(), sortedItems.begin(), sortedItems.end());
+ ans.push_back(header);
+ for (auto& [table, items] : tables) {
+ unordered_map cnt;
+ for (string& item : items) {
+ cnt[item]++;
+ }
+ vector row;
+ row.push_back(to_string(table));
+ for (const string& item : sortedItems) {
+ row.push_back(to_string(cnt[item]));
}
- res.push_back(tmp);
+ ans.push_back(row);
}
- return res;
+ return ans;
}
};
```
@@ -187,43 +189,74 @@ public:
```go
func displayTable(orders [][]string) [][]string {
- tables := make(map[int]bool)
- foods := make(map[string]bool)
- mp := make(map[string]int)
+ tables := make(map[int]map[string]int)
+ items := make(map[string]bool)
for _, order := range orders {
- table, food := order[1], order[2]
- t, _ := strconv.Atoi(table)
- tables[t] = true
- foods[food] = true
- key := table + "." + food
- mp[key] += 1
- }
- var t []int
- var f []string
- for i := range tables {
- t = append(t, i)
+ table, _ := strconv.Atoi(order[1])
+ foodItem := order[2]
+ if tables[table] == nil {
+ tables[table] = make(map[string]int)
+ }
+ tables[table][foodItem]++
+ items[foodItem] = true
}
- for i := range foods {
- f = append(f, i)
+ sortedItems := make([]string, 0, len(items))
+ for item := range items {
+ sortedItems = append(sortedItems, item)
}
- sort.Ints(t)
- sort.Strings(f)
- var res [][]string
- var title []string
- title = append(title, "Table")
- for _, e := range f {
- title = append(title, e)
+ sort.Strings(sortedItems)
+ ans := [][]string{}
+ header := append([]string{"Table"}, sortedItems...)
+ ans = append(ans, header)
+ tableNums := make([]int, 0, len(tables))
+ for table := range tables {
+ tableNums = append(tableNums, table)
}
- res = append(res, title)
- for _, table := range t {
- var tmp []string
- tmp = append(tmp, strconv.Itoa(table))
- for _, food := range f {
- tmp = append(tmp, strconv.Itoa(mp[strconv.Itoa(table)+"."+food]))
+ sort.Ints(tableNums)
+ for _, table := range tableNums {
+ row := []string{strconv.Itoa(table)}
+ for _, item := range sortedItems {
+ count := tables[table][item]
+ row = append(row, strconv.Itoa(count))
}
- res = append(res, tmp)
+ ans = append(ans, row)
}
- return res
+ return ans
+}
+```
+
+#### TypeScript
+
+```ts
+function displayTable(orders: string[][]): string[][] {
+ const tables: Record> = {};
+ const items: Set = new Set();
+ for (const [_, table, foodItem] of orders) {
+ const t = +table;
+ if (!tables[t]) {
+ tables[t] = {};
+ }
+ if (!tables[t][foodItem]) {
+ tables[t][foodItem] = 0;
+ }
+ tables[t][foodItem]++;
+ items.add(foodItem);
+ }
+ const sortedItems = Array.from(items).sort();
+ const ans: string[][] = [];
+ const header: string[] = ['Table', ...sortedItems];
+ ans.push(header);
+ const sortedTableNumbers = Object.keys(tables)
+ .map(Number)
+ .sort((a, b) => a - b);
+ for (const table of sortedTableNumbers) {
+ const row: string[] = [table.toString()];
+ for (const item of sortedItems) {
+ row.push((tables[table][item] || 0).toString());
+ }
+ ans.push(row);
+ }
+ return ans;
}
```
diff --git a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README_EN.md b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README_EN.md
index 79d27902b765f..8280934e6cc8f 100644
--- a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README_EN.md
+++ b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/README_EN.md
@@ -34,7 +34,7 @@ tags:
Input: orders = [["David","3","Ceviche"],["Corina","10","Beef Burrito"],["David","3","Fried Chicken"],["Carla","5","Water"],["Carla","5","Ceviche"],["Rous","3","Ceviche"]]
-Output: [["Table","Beef Burrito","Ceviche","Fried Chicken","Water"],["3","0","2","1","0"],["5","0","1","0","1"],["10","1","0","0","0"]]
+Output: [["Table","Beef Burrito","Ceviche","Fried Chicken","Water"],["3","0","2","1","0"],["5","0","1","0","1"],["10","1","0","0","0"]]
Explanation:
@@ -52,7 +52,7 @@ For the table 3: David orders "Ceviche" and "Fried Chicken",
For the table 5: Carla orders "Water" and "Ceviche".
-For the table 10: Corina orders "Beef Burrito".
+For the table 10: Corina orders "Beef Burrito".
@@ -62,9 +62,9 @@ For the table 10: Corina orders "Beef Burrito".
Input: orders = [["James","12","Fried Chicken"],["Ratesh","12","Fried Chicken"],["Amadeus","12","Fried Chicken"],["Adam","1","Canadian Waffles"],["Brianna","1","Canadian Waffles"]]
-Output: [["Table","Canadian Waffles","Fried Chicken"],["1","2","0"],["12","0","3"]]
+Output: [["Table","Canadian Waffles","Fried Chicken"],["1","2","0"],["12","0","3"]]
-Explanation:
+Explanation:
For the table 1: Adam and Brianna order "Canadian Waffles".
@@ -106,7 +106,19 @@ For the table 12: James, Ratesh and Amadeus order "Fried Chicken".
-### Solution 1
+### Solution 1: Hash Table + Sorting
+
+We can use a hash table $\textit{tables}$ to store the dishes ordered at each table, and a set $\textit{items}$ to store all the dishes.
+
+Traverse $\textit{orders}$, storing the dishes ordered at each table in $\textit{tables}$ and $\textit{items}$.
+
+Then we sort $\textit{items}$ to get $\textit{sortedItems}$.
+
+Next, we construct the answer array $\textit{ans}$. First, add the header row $\textit{header}$ to $\textit{ans}$. Then, traverse the sorted $\textit{tables}$. For each table, use a counter $\textit{cnt}$ to count the number of each dish, then construct a row $\textit{row}$ and add it to $\textit{ans}$.
+
+Finally, return $\textit{ans}$.
+
+The time complexity is $O(n + m \times \log m + k \times \log k + m \times k)$, and the space complexity is $O(n + m + k)$. Here, $n$ is the length of the array $\textit{orders}$, while $m$ and $k$ represent the number of dish types and the number of tables, respectively.
@@ -115,22 +127,18 @@ For the table 12: James, Ratesh and Amadeus order "Fried Chicken".
```python
class Solution:
def displayTable(self, orders: List[List[str]]) -> List[List[str]]:
- tables = set()
- foods = set()
- mp = Counter()
- for _, table, food in orders:
- tables.add(int(table))
- foods.add(food)
- mp[f'{table}.{food}'] += 1
- foods = sorted(list(foods))
- tables = sorted(list(tables))
- res = [['Table'] + foods]
- for table in tables:
- t = [str(table)]
- for food in foods:
- t.append(str(mp[f'{table}.{food}']))
- res.append(t)
- return res
+ tables = defaultdict(list)
+ items = set()
+ for _, table, foodItem in orders:
+ tables[int(table)].append(foodItem)
+ items.add(foodItem)
+ sorted_items = sorted(items)
+ ans = [["Table"] + sorted_items]
+ for table in sorted(tables):
+ cnt = Counter(tables[table])
+ row = [str(table)] + [str(cnt[item]) for item in sorted_items]
+ ans.append(row)
+ return ans
```
#### Java
@@ -138,35 +146,34 @@ class Solution:
```java
class Solution {
public List> displayTable(List> orders) {
- Set tables = new HashSet<>();
- Set foods = new HashSet<>();
- Map mp = new HashMap<>();
- for (List order : orders) {
- int table = Integer.parseInt(order.get(1));
- String food = order.get(2);
- tables.add(table);
- foods.add(food);
- String key = table + "." + food;
- mp.put(key, mp.getOrDefault(key, 0) + 1);
+ TreeMap> tables = new TreeMap<>();
+ Set items = new HashSet<>();
+ for (List o : orders) {
+ int table = Integer.parseInt(o.get(1));
+ String foodItem = o.get(2);
+ tables.computeIfAbsent(table, k -> new ArrayList<>()).add(foodItem);
+ items.add(foodItem);
}
- List t = new ArrayList<>(tables);
- List f = new ArrayList<>(foods);
- Collections.sort(t);
- Collections.sort(f);
- List> res = new ArrayList<>();
- List title = new ArrayList<>();
- title.add("Table");
- title.addAll(f);
- res.add(title);
- for (int table : t) {
- List tmp = new ArrayList<>();
- tmp.add(String.valueOf(table));
- for (String food : f) {
- tmp.add(String.valueOf(mp.getOrDefault(table + "." + food, 0)));
+ List sortedItems = new ArrayList<>(items);
+ Collections.sort(sortedItems);
+ List> ans = new ArrayList<>();
+ List header = new ArrayList<>();
+ header.add("Table");
+ header.addAll(sortedItems);
+ ans.add(header);
+ for (Map.Entry> entry : tables.entrySet()) {
+ Map cnt = new HashMap<>();
+ for (String item : entry.getValue()) {
+ cnt.merge(item, 1, Integer::sum);
+ }
+ List row = new ArrayList<>();
+ row.add(String.valueOf(entry.getKey()));
+ for (String item : sortedItems) {
+ row.add(String.valueOf(cnt.getOrDefault(item, 0)));
}
- res.add(tmp);
+ ans.add(row);
}
- return res;
+ return ans;
}
}
```
@@ -177,36 +184,31 @@ class Solution {
class Solution {
public:
vector> displayTable(vector>& orders) {
- unordered_set tables;
- unordered_set foods;
- unordered_map mp;
- for (auto& order : orders) {
- int table = stoi(order[1]);
- string food = order[2];
- tables.insert(table);
- foods.insert(food);
- ++mp[order[1] + "." + food];
+ map> tables;
+ set sortedItems;
+ for (auto& o : orders) {
+ int table = stoi(o[1]);
+ string foodItem = o[2];
+ tables[table].push_back(foodItem);
+ sortedItems.insert(foodItem);
}
- vector t;
- t.assign(tables.begin(), tables.end());
- sort(t.begin(), t.end());
- vector f;
- f.assign(foods.begin(), foods.end());
- sort(f.begin(), f.end());
- vector> res;
- vector title;
- title.push_back("Table");
- for (auto e : f) title.push_back(e);
- res.push_back(title);
- for (int table : t) {
- vector tmp;
- tmp.push_back(to_string(table));
- for (string food : f) {
- tmp.push_back(to_string(mp[to_string(table) + "." + food]));
+ vector> ans;
+ vector header = {"Table"};
+ header.insert(header.end(), sortedItems.begin(), sortedItems.end());
+ ans.push_back(header);
+ for (auto& [table, items] : tables) {
+ unordered_map cnt;
+ for (string& item : items) {
+ cnt[item]++;
+ }
+ vector row;
+ row.push_back(to_string(table));
+ for (const string& item : sortedItems) {
+ row.push_back(to_string(cnt[item]));
}
- res.push_back(tmp);
+ ans.push_back(row);
}
- return res;
+ return ans;
}
};
```
@@ -215,43 +217,74 @@ public:
```go
func displayTable(orders [][]string) [][]string {
- tables := make(map[int]bool)
- foods := make(map[string]bool)
- mp := make(map[string]int)
+ tables := make(map[int]map[string]int)
+ items := make(map[string]bool)
for _, order := range orders {
- table, food := order[1], order[2]
- t, _ := strconv.Atoi(table)
- tables[t] = true
- foods[food] = true
- key := table + "." + food
- mp[key] += 1
- }
- var t []int
- var f []string
- for i := range tables {
- t = append(t, i)
+ table, _ := strconv.Atoi(order[1])
+ foodItem := order[2]
+ if tables[table] == nil {
+ tables[table] = make(map[string]int)
+ }
+ tables[table][foodItem]++
+ items[foodItem] = true
}
- for i := range foods {
- f = append(f, i)
+ sortedItems := make([]string, 0, len(items))
+ for item := range items {
+ sortedItems = append(sortedItems, item)
}
- sort.Ints(t)
- sort.Strings(f)
- var res [][]string
- var title []string
- title = append(title, "Table")
- for _, e := range f {
- title = append(title, e)
+ sort.Strings(sortedItems)
+ ans := [][]string{}
+ header := append([]string{"Table"}, sortedItems...)
+ ans = append(ans, header)
+ tableNums := make([]int, 0, len(tables))
+ for table := range tables {
+ tableNums = append(tableNums, table)
}
- res = append(res, title)
- for _, table := range t {
- var tmp []string
- tmp = append(tmp, strconv.Itoa(table))
- for _, food := range f {
- tmp = append(tmp, strconv.Itoa(mp[strconv.Itoa(table)+"."+food]))
+ sort.Ints(tableNums)
+ for _, table := range tableNums {
+ row := []string{strconv.Itoa(table)}
+ for _, item := range sortedItems {
+ count := tables[table][item]
+ row = append(row, strconv.Itoa(count))
}
- res = append(res, tmp)
+ ans = append(ans, row)
}
- return res
+ return ans
+}
+```
+
+#### TypeScript
+
+```ts
+function displayTable(orders: string[][]): string[][] {
+ const tables: Record> = {};
+ const items: Set = new Set();
+ for (const [_, table, foodItem] of orders) {
+ const t = +table;
+ if (!tables[t]) {
+ tables[t] = {};
+ }
+ if (!tables[t][foodItem]) {
+ tables[t][foodItem] = 0;
+ }
+ tables[t][foodItem]++;
+ items.add(foodItem);
+ }
+ const sortedItems = Array.from(items).sort();
+ const ans: string[][] = [];
+ const header: string[] = ['Table', ...sortedItems];
+ ans.push(header);
+ const sortedTableNumbers = Object.keys(tables)
+ .map(Number)
+ .sort((a, b) => a - b);
+ for (const table of sortedTableNumbers) {
+ const row: string[] = [table.toString()];
+ for (const item of sortedItems) {
+ row.push((tables[table][item] || 0).toString());
+ }
+ ans.push(row);
+ }
+ return ans;
}
```
diff --git a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.cpp b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.cpp
index b7f8063cd2d67..dc02597f59955 100644
--- a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.cpp
+++ b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.cpp
@@ -1,35 +1,30 @@
class Solution {
public:
vector> displayTable(vector>& orders) {
- unordered_set tables;
- unordered_set foods;
- unordered_map mp;
- for (auto& order : orders) {
- int table = stoi(order[1]);
- string food = order[2];
- tables.insert(table);
- foods.insert(food);
- ++mp[order[1] + "." + food];
+ map> tables;
+ set sortedItems;
+ for (auto& o : orders) {
+ int table = stoi(o[1]);
+ string foodItem = o[2];
+ tables[table].push_back(foodItem);
+ sortedItems.insert(foodItem);
}
- vector t;
- t.assign(tables.begin(), tables.end());
- sort(t.begin(), t.end());
- vector f;
- f.assign(foods.begin(), foods.end());
- sort(f.begin(), f.end());
- vector> res;
- vector title;
- title.push_back("Table");
- for (auto e : f) title.push_back(e);
- res.push_back(title);
- for (int table : t) {
- vector tmp;
- tmp.push_back(to_string(table));
- for (string food : f) {
- tmp.push_back(to_string(mp[to_string(table) + "." + food]));
+ vector> ans;
+ vector header = {"Table"};
+ header.insert(header.end(), sortedItems.begin(), sortedItems.end());
+ ans.push_back(header);
+ for (auto& [table, items] : tables) {
+ unordered_map cnt;
+ for (string& item : items) {
+ cnt[item]++;
}
- res.push_back(tmp);
+ vector row;
+ row.push_back(to_string(table));
+ for (const string& item : sortedItems) {
+ row.push_back(to_string(cnt[item]));
+ }
+ ans.push_back(row);
}
- return res;
+ return ans;
}
-};
\ No newline at end of file
+};
diff --git a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.go b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.go
index 7a438edb87d30..c5e85eae0adaf 100644
--- a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.go
+++ b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.go
@@ -1,39 +1,35 @@
func displayTable(orders [][]string) [][]string {
- tables := make(map[int]bool)
- foods := make(map[string]bool)
- mp := make(map[string]int)
+ tables := make(map[int]map[string]int)
+ items := make(map[string]bool)
for _, order := range orders {
- table, food := order[1], order[2]
- t, _ := strconv.Atoi(table)
- tables[t] = true
- foods[food] = true
- key := table + "." + food
- mp[key] += 1
- }
- var t []int
- var f []string
- for i := range tables {
- t = append(t, i)
+ table, _ := strconv.Atoi(order[1])
+ foodItem := order[2]
+ if tables[table] == nil {
+ tables[table] = make(map[string]int)
+ }
+ tables[table][foodItem]++
+ items[foodItem] = true
}
- for i := range foods {
- f = append(f, i)
+ sortedItems := make([]string, 0, len(items))
+ for item := range items {
+ sortedItems = append(sortedItems, item)
}
- sort.Ints(t)
- sort.Strings(f)
- var res [][]string
- var title []string
- title = append(title, "Table")
- for _, e := range f {
- title = append(title, e)
+ sort.Strings(sortedItems)
+ ans := [][]string{}
+ header := append([]string{"Table"}, sortedItems...)
+ ans = append(ans, header)
+ tableNums := make([]int, 0, len(tables))
+ for table := range tables {
+ tableNums = append(tableNums, table)
}
- res = append(res, title)
- for _, table := range t {
- var tmp []string
- tmp = append(tmp, strconv.Itoa(table))
- for _, food := range f {
- tmp = append(tmp, strconv.Itoa(mp[strconv.Itoa(table)+"."+food]))
+ sort.Ints(tableNums)
+ for _, table := range tableNums {
+ row := []string{strconv.Itoa(table)}
+ for _, item := range sortedItems {
+ count := tables[table][item]
+ row = append(row, strconv.Itoa(count))
}
- res = append(res, tmp)
+ ans = append(ans, row)
}
- return res
-}
\ No newline at end of file
+ return ans
+}
diff --git a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.java b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.java
index 979eda166f2c1..1278ccdddb78c 100644
--- a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.java
+++ b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.java
@@ -1,33 +1,32 @@
class Solution {
public List> displayTable(List> orders) {
- Set tables = new HashSet<>();
- Set foods = new HashSet<>();
- Map mp = new HashMap<>();
- for (List order : orders) {
- int table = Integer.parseInt(order.get(1));
- String food = order.get(2);
- tables.add(table);
- foods.add(food);
- String key = table + "." + food;
- mp.put(key, mp.getOrDefault(key, 0) + 1);
+ TreeMap> tables = new TreeMap<>();
+ Set items = new HashSet<>();
+ for (List o : orders) {
+ int table = Integer.parseInt(o.get(1));
+ String foodItem = o.get(2);
+ tables.computeIfAbsent(table, k -> new ArrayList<>()).add(foodItem);
+ items.add(foodItem);
}
- List t = new ArrayList<>(tables);
- List f = new ArrayList<>(foods);
- Collections.sort(t);
- Collections.sort(f);
- List> res = new ArrayList<>();
- List title = new ArrayList<>();
- title.add("Table");
- title.addAll(f);
- res.add(title);
- for (int table : t) {
- List tmp = new ArrayList<>();
- tmp.add(String.valueOf(table));
- for (String food : f) {
- tmp.add(String.valueOf(mp.getOrDefault(table + "." + food, 0)));
+ List sortedItems = new ArrayList<>(items);
+ Collections.sort(sortedItems);
+ List> ans = new ArrayList<>();
+ List header = new ArrayList<>();
+ header.add("Table");
+ header.addAll(sortedItems);
+ ans.add(header);
+ for (Map.Entry> entry : tables.entrySet()) {
+ Map cnt = new HashMap<>();
+ for (String item : entry.getValue()) {
+ cnt.merge(item, 1, Integer::sum);
}
- res.add(tmp);
+ List row = new ArrayList<>();
+ row.add(String.valueOf(entry.getKey()));
+ for (String item : sortedItems) {
+ row.add(String.valueOf(cnt.getOrDefault(item, 0)));
+ }
+ ans.add(row);
}
- return res;
+ return ans;
}
-}
\ No newline at end of file
+}
diff --git a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.py b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.py
index e602f22e225cc..888ea4476689f 100644
--- a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.py
+++ b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.py
@@ -1,18 +1,14 @@
class Solution:
def displayTable(self, orders: List[List[str]]) -> List[List[str]]:
- tables = set()
- foods = set()
- mp = Counter()
- for _, table, food in orders:
- tables.add(int(table))
- foods.add(food)
- mp[f'{table}.{food}'] += 1
- foods = sorted(list(foods))
- tables = sorted(list(tables))
- res = [['Table'] + foods]
- for table in tables:
- t = [str(table)]
- for food in foods:
- t.append(str(mp[f'{table}.{food}']))
- res.append(t)
- return res
+ tables = defaultdict(list)
+ items = set()
+ for _, table, foodItem in orders:
+ tables[int(table)].append(foodItem)
+ items.add(foodItem)
+ sorted_items = sorted(items)
+ ans = [["Table"] + sorted_items]
+ for table in sorted(tables):
+ cnt = Counter(tables[table])
+ row = [str(table)] + [str(cnt[item]) for item in sorted_items]
+ ans.append(row)
+ return ans
diff --git a/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.ts b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.ts
new file mode 100644
index 0000000000000..a8d4d398a86c9
--- /dev/null
+++ b/solution/1400-1499/1418.Display Table of Food Orders in a Restaurant/Solution.ts
@@ -0,0 +1,30 @@
+function displayTable(orders: string[][]): string[][] {
+ const tables: Record> = {};
+ const items: Set = new Set();
+ for (const [_, table, foodItem] of orders) {
+ const t = +table;
+ if (!tables[t]) {
+ tables[t] = {};
+ }
+ if (!tables[t][foodItem]) {
+ tables[t][foodItem] = 0;
+ }
+ tables[t][foodItem]++;
+ items.add(foodItem);
+ }
+ const sortedItems = Array.from(items).sort();
+ const ans: string[][] = [];
+ const header: string[] = ['Table', ...sortedItems];
+ ans.push(header);
+ const sortedTableNumbers = Object.keys(tables)
+ .map(Number)
+ .sort((a, b) => a - b);
+ for (const table of sortedTableNumbers) {
+ const row: string[] = [table.toString()];
+ for (const item of sortedItems) {
+ row.push((tables[table][item] || 0).toString());
+ }
+ ans.push(row);
+ }
+ return ans;
+}