【刷爆LeetCode】七月算法集训(22)有序集合

本文介绍了LeetCode中的一道中等难度问题——1418.点菜展示表。解题思路涉及遍历订单,统计每桌点餐数量,然后按照规定格式构建展示表。代码演示使用C++实现,展示表的构造遵循菜品名按字典序排序,餐桌编号升序排列的原则。每日坚持算法训练,可以显著提升编程技能。
摘要由CSDN通过智能技术生成

题目来源于知识星球—英雄算法联盟,七月算法集训专题

前言

跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
今天只有一道题奈!


一、1418.点菜展示表(中等)

1.题目描述

https://img-blog.csdnimg.cn/9228089a7fce408c9bef9d20774f271b.jpeg =500x

2.解题思路

结果为一张订单表,第一行为所有饭菜的名称,按字典序排序;
订单表第一列为所有用餐的餐桌编号,升序排列;
订单表的中间信息为某一桌所下单的某一道菜的数量;
因此需要遍历所有菜品的名称和餐桌编号,然后对于餐品的数量,逐行填写即可。

3.代码演示(C++)

class Solution 
{
public:
    vector<vector<string>> displayTable(vector<vector<string>> &orders) 
    {
        // 从订单中获取餐品名称和桌号,统计每桌点餐数量
        unordered_set<string> nameSet;
        unordered_map<int, unordered_map<string, int>> foodsCnt;
        for (auto &order : orders) 
        {
            nameSet.insert(order[2]);
            int id = stoi(order[1]);
            ++foodsCnt[id][order[2]];
        }
        // 提取餐品名称,并按字母顺序排列
        int n = nameSet.size();
        vector<string> names;
        for (auto &name : nameSet) 
        {
            names.push_back(name);
        }
        sort(names.begin(), names.end());
        // 提取桌号,并按餐桌桌号升序排列
        int m = foodsCnt.size();
        vector<int> ids;
        for (auto &[id, _] : foodsCnt) 
        {
            ids.push_back(id);
        }
        sort(ids.begin(), ids.end());
        // 填写点菜展示表
        vector<vector<string>> table(m + 1, vector<string>(n + 1));
        table[0][0] = "Table";
        copy(names.begin(), names.end(), table[0].begin() + 1);
        for (int i = 0; i < m; ++i) 
        {
            int id = ids[i];
            auto &cnt = foodsCnt[id];
            table[i + 1][0] = to_string(id);
            for (int j = 0; j < n; ++j) 
            {
                table[i + 1][j + 1] = to_string(cnt[names[j]]);
            }
        }
        return table;
    }
};

4.题目链接

题目传送门


总结

每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值