(实战类编程题)点菜展示表实现--利用哈希表作值

题目

在这里插入图片描述

题目解析

读完题目,我们需要确定的有三点:

  1. 菜品名目。2. 顾客所在餐桌号。3. 该餐桌号该类菜品需要的数目。

题目中还要求,菜品名目需要按照字典序排序,所在餐桌号也需要如此。

  • 根据以上解读我们可以给出以下方法进行逐一解决:
  1. 建立哈希表用于记录映射关系:创建以哈希表为 value 的哈希表,通过餐桌号来索引到另一个哈希表,另一哈希表用于记录这一桌所点的菜的种类对应的个数。同时用集合记录菜的种类(用于去重)。
  2. 通过数组记录数据用于排序:通过遍历集合得到一个字符串数组,然后根据字典序对其进行排序。通过遍历哈希表将它的键放入到新的数组中用于排序。
  3. 通过前面建立的数组和哈希表,创建并更新答案table

逐步解析代码

建立哈希表映射

 // 从订单中获取餐品名称和桌号,统计每桌点餐数量
        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(n);
        int i = 0;
        for (auto &name : nameSet) {
            names[i++] = name;
        }
        sort(names.begin(), names.end());

        // 提取桌号,并按餐桌桌号升序排列
        int m = foodsCnt.size();
        vector<int> ids(m);
        int j =0;
        for (auto &[id, _] : foodsCnt) {
            ids[j++] = id;
        }
        sort(ids.begin(), ids.end());

更新table(copy函数的使用)

 // 填写点菜展示表
        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]]);
            }
        }

整合答案

在这里插入图片描述

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 = atoi(order[1].c_str());
            foodsCnt[id][order[2]]++;
        }
        // 提取餐品名称,并按字母顺序排列
        int n = nameSet.size();
        vector<string> names(n);
        int i = 0;
        for (auto &name : nameSet) {
            names[i++] = name;
        }
        sort(names.begin(), names.end());

        // 提取桌号,并按餐桌桌号升序排列
        int m = foodsCnt.size();
        vector<int> ids(m);
        int j =0;
        for (auto &[id, _] : foodsCnt) {
            ids[j++] = 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;
    }
};

做题收获

做完此题我收获到了以下内容:

  1. 哈希表作键值的应用方法。
  2. copy()函数的使用方法,三个参数:第一个是需要copy的数据起点,第二个是终点,第三个是需要copy到的位置起点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值