题目链接: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;}
};

LeetCode - 点菜展示表相关推荐

  1. LeetCode 1418. 点菜展示表(哈希map)

    1. 题目 给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 custome ...

  2. 1418. 点菜展示表

    给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei ...

  3. 【数据结构与算法】之深入解析“点菜展示表”的求解思路与算法示例

    一.题目要求 给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说,orders[i]=[customerNamei,tableNumberi,foodItemi],其中 customer ...

  4. 文巾解题 1418. 点菜展示表

    1 题目描述 2 解题思路 分几步走: 第一步:找到一共几张桌子,一共有几 class Solution(object):def displayTable(self, orders):"&q ...

  5. 七十五、Python | Leetcode哈希表系列

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  6. python leetcode_七十五、Python | Leetcode哈希表系列

    @Author:Runsen @Date:2020/7/3 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  7. LeetCode 171. Excel表列序号(26进制转10进制)

    1. 题目 给定一个Excel表格中的列名称,返回其相应的列序号. 例如,A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 ...

  8. MySql展示表字段

    MySql展示表字段 show create table 表名称; //展示建表语句 SHOW DATABASES; //列出MySQL数据库. SHOW TABLES FROM 数据库名称; //列 ...

  9. LeetCode 2194. Excel 表中某个范围内的单元格

    文章目录 1. 题目 2. 解题 1. 题目 Excel 表中的一个单元格 (r, c) 会以字符串 "<col><row>" 的形式进行表示,其中: &l ...

最新文章

  1. CTO怒了:“如果中台不省钱,我建个屁中台啊!”
  2. Python 单例模式
  3. mysql分组后去重复数据_mysql去掉重复数据只保留一条,以及取分组后的一条数据...
  4. Linux中shell变量作用域笔记
  5. 微信iOS 7.0.9版本更新:今天的朋友圈是一片欢乐的海洋!
  6. sublime与python交互
  7. java 定时器qz xm配置_java_Java的作业调度类库Quartz基本使用指南,一、常用接口: 1、Job接口: - phpStudy...
  8. H3C交换机配件RS232配置线(DB9针转RJ45)
  9. 安装idea(最新版IntelliJ IDEA)编译器(详细到每步)
  10. 虚拟机游戏服务器更新物品,【青云志】虚拟机镜像一键服务端+全物品ID配套客户端+图文架设教程+GM工具...
  11. 【软件测试】软件测试为什么会用到Linux?
  12. HTML转PDF(Thymeleaf做模板)
  13. 面试题猜想:1+1等于几?
  14. 数据库实验三 存储过程与触发器
  15. ttl转rs232发送十六进制_电脑USB转TTL串口RS232串口模块
  16. SQL语句大全(Mysql)
  17. 解决pip install d2l失败的问题
  18. 树莓派制作家用服务器,树莓派搭建家用小型NAS服务器
  19. 数据库编程入门培训(一)
  20. Java简单项目 水果摊

热门文章

  1. 三菱FX5U位逻辑指令
  2. 咖啡汪日志—— 回退兜底 及实用的服务降级策略
  3. Processing学习 — Processing结合Kinect2实现人影互动
  4. PERCENTILE_CONT
  5. 【Alpha】Phylab 展示博客
  6. Python 详细教程 —— pyautogui 库 基本用法
  7. MySQL对数据表进行分组查询(GROUP BY)
  8. python操作键盘输入中文_python模拟鼠标点击和键盘输入的操作
  9. Spark中cache、persist、checkpoint区别
  10. win2008系统 安装hplaserj1010打印机驱动程序