【leetcode】1418. 点菜展示表(display-table-of-food-orders-in-a-restaurant)(模拟)[中等]

215 篇文章 0 订阅
66 篇文章 0 订阅

链接

https://leetcode-cn.com/problems/display-table-of-food-orders-in-a-restaurant/

耗时

解题:1 h 24 min
题解:8 min

题意

给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。

请你返回该餐厅的 点菜展示表在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。

注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。

提示:

  • 1 <= orders.length <= 5 * 10^4
  • orders[i].length == 3
  • 1 <= customerNamei.length, foodItemi.length <= 20
  • customerNameifoodItemi 由大小写英文字母及空格字符 ' ' 组成。
  • tableNumberi1500 范围内的整数。

思路

模拟题意即可,把所有的 桌号 和 菜名 去下重,使其唯一,再排序,然后按顺序编号,这样就有每个桌号和菜名对应的位置了,遍历orders按编号位置每次+1,最后顺序遍历计算好的矩阵做出题意要的 点菜展示表。

时间复杂度: O ( 5 ∗ 1 0 4 ∗ 500 ) O(5 * 10^4 * 500) O(5104500)

AC代码

class Solution {
public:
    vector<vector<string>> displayTable(vector<vector<string>>& orders) {
        // 用 set 去重 桌号 和 菜名
        set<int> table_set;
        set<string> food_set;
        for(auto order : orders) {
            string tableNumber = order[1];
            string foodItem = order[2];
            table_set.insert(stoi( tableNumber ));
            food_set.insert(foodItem);
        }
        
        // 给 桌子 和 菜 一个编号
        unordered_map<string, int> table_id, food_id;
        int curr_table_id = 0, curr_food_id = 0;
        for(auto tableNumber : table_set) {
            table_id[to_string(tableNumber)] = curr_table_id;
            curr_table_id++;
        }
        for(auto foodItem : food_set) {
            food_id[foodItem] = curr_food_id;
            curr_food_id++;
        }
        
        // 计算 每桌 每个菜 的数量
        vector<vector<int>> cal_table(curr_table_id, vector<int>(curr_food_id, 0));
        for(auto order : orders) {
            string tableNumber = order[1];
            string foodItem = order[2];
            cal_table[table_id[tableNumber]][food_id[foodItem]]++;
        }
        
        // 制作 点菜展示表
        vector<vector<string>> display_table(curr_table_id+1, vector<string>(curr_food_id+1, "0"));
        display_table[0][0] = "Table";
        int i = 1;
        for(auto foodItem : food_set) {
            display_table[0][i++] = foodItem;
        }
        i = 1;
        for(auto tableNumber : table_set) {
            display_table[i++][0] = to_string(tableNumber);
        }
        for(int i = 1; i <= curr_table_id; ++i) {
            for(int j = 1; j <= curr_food_id; ++j) {
                display_table[i][j] = to_string(cal_table[i-1][j-1]);
            }
        }
        
        return display_table;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值