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

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(实战类编程题)点菜展示表实现--利用哈希表作值相关的知识,希望对你有一定的参考价值。

题目

在这里插入图片描述

题目解析

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

  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到的位置起点。

以上是关于(实战类编程题)点菜展示表实现--利用哈希表作值的主要内容,如果未能解决你的问题,请参考以下文章

[MSTL] lc1418. 点菜展示表(模拟+哈希表)

LeetCode 1418. 点菜展示表 / NC103 反转字符串 / NC33 合并有序链表 / NC61两数之和

❤️数据结构入门❤️(1 - 8)- 哈希表

leetcode-1418-点菜展示表

1418. 点菜展示表

文巾解题 1418. 点菜展示表