先上结果 2021/07/06 leetcode题目
1418. 点菜展示表
给你一个数组 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”]]
提示:
1 <= orders.length <= 5 * 10^4
orders[i].length == 3
1 <= customerNamei.length, foodItemi.length <= 20
customerNamei 和 foodItemi 由大小写英文字母及空格字符 ' ' 组成。
tableNumberi 是 1 到 500 范围内的整数。
题目描述如上,下面我讲一下我对这题的思路看法:
首先呢,这题给的是一个 orders,这是一个二维的String类型的数组,数组里面放的是len = orders.length长的数据,然后每条数据里面放的是三个信息,分别是顾客姓名、就坐餐桌编号 和 所点的菜品名,其中根据题目意思顾客的姓名是不需要的信息。 题目要求是需要输出一个二维String类型的 List 数组,其中第一行内容是 “Table” + 字典序排列的所有 orders 数据里面出现过的菜品名,第二行开始的话就是 用餐座位号(按照字典序进行行排列) + 和各个对应的菜品名各自使用的份数
思路: 根据题目要求,第一行里面的数据和从第二行开始的数据都不相同,所以建议对于最后需要输出的结果进行两部分添加,
第一部分: “Table” + 字典序排列菜品名
第二部分: 横向是按照table_num (餐桌号) + 第一部分对应列菜品名 使用的份数
多行竖直部分是按照table_num (餐桌号)字典序排列的
设计:
第一部分菜品名在orders中的多条数据中可能会重复出现,所以可以创建一个Set容器去存去去重复元素的所有菜品名,还有一点对于第一部分菜品名要实现字典排序,所以有两个思路,
一,先将所有菜品名存入HashSet中,然后在将所有菜品名从HashSet中遍历取出(提示:set不是连续存储,不能像数组那样通过下标index那样直接访问)放到 ArrayList 中去,之后在使用Collections.sort(List)方法去对所有菜品名实现字典序排序;
二,直接使用TreeSet容器,TreeSet容器有自带的根据容器内元素按照字典序排序的功能。
第二部分需要输出的每条记录可以说是以 餐桌号 为主键进行索引然后访问得到每个餐桌上所有菜品上过的数量 首先对于任意一条数据的话,即任意一个出现过的 餐桌的所有各类菜品对应数量 可以使用一个Map<String, Integer>去进行存储,然后对于多条记录多个餐桌的话可以使用map里面嵌套map Map<Integer,Map<String, Integer>>去处理,不过这样子设计还存在一个问题,就是对于第二部分的最左边那一列也需要按照字典序排序,这个需要处理一下,这个可以参考一下上面第一部分的就是可以用一个Set去存储所有的餐桌号,然后根据第一部分的方法去对所有的餐桌号去分别查找对应的Map<String, Integer> ,然后再根据找到的Map去根据 第一部分存储的按字典排序的菜品名进行 搜索 菜品名对应的数量。 到这里大部分算法思想大概是讲完了。
剩下的就是边界值和细节了。这个就不细写了。
下面上代码:
使用的语言是java语言
class Solution {
public List<List<String>> displayTable(List<List<String>> orders) {
Set<String> food_names = new TreeSet<String>();
Set<Integer> table_num = new TreeSet<Integer>();
Map<Integer, Map<String, Integer>> table_map = new HashMap<Integer, Map<String, Integer>>();
int len = orders.size();
for (int i = 0; i < len; ++i){
List<String> list = orders.get(i);
food_names.add(list.get(2));
int id = Integer.parseInt(list.get(1));
table_num.add(id);
Map<String, Integer> map = table_map.getOrDefault(id, new HashMap<String, Integer>());
map.put(list.get(2), map.getOrDefault(list.get(2), 0) + 1);
table_map.put(id, map);
}
List<List<String>> ans = new ArrayList<List<String>>();
List<String> temp = new ArrayList<String>();
temp.add("Table");
for (String food_name : food_names){
temp.add(food_name);
}
ans.add(temp);
for (int num : table_num){
List<String> list = new ArrayList<String>();
list.add(num + "");
Map<String, Integer> map = table_map.get(num);
for (String food_name : food_names){
list.add(map.getOrDefault(food_name, 0) + "");
}
ans.add(list);
}
return ans;
}
}
最后,本博主的代码和算法能力有限,如果大家有对于这题的更好的算法解题思维或者其他不同的解题方法也请大家能够在下面评论或者留言,期待和欢迎各位大佬的点评和指正,谢谢。