(实战类编程题)点菜展示表实现--利用哈希表作值
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(实战类编程题)点菜展示表实现--利用哈希表作值相关的知识,希望对你有一定的参考价值。
题目
题目解析
读完题目,我们需要确定的有三点:
- 菜品名目。2. 顾客所在餐桌号。3. 该餐桌号该类菜品需要的数目。
题目中还要求,菜品名目需要按照字典序排序,所在餐桌号也需要如此。
- 根据以上解读我们可以给出以下方法进行逐一解决:
- 建立哈希表用于记录映射关系:创建以哈希表为
value
的哈希表,通过餐桌号来索引到另一个哈希表,另一哈希表用于记录这一桌所点的菜的种类对应的个数。同时用集合记录菜的种类(用于去重)。 - 通过数组记录数据用于排序:通过遍历集合得到一个字符串数组,然后根据字典序对其进行排序。通过遍历哈希表将它的键放入到新的数组中用于排序。
- 通过前面建立的数组和哈希表,创建并更新答案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;
}
};
做题收获
做完此题我收获到了以下内容:
- 哈希表作键值的应用方法。
- copy()函数的使用方法,三个参数:第一个是需要copy的数据起点,第二个是终点,第三个是需要copy到的位置起点。
以上是关于(实战类编程题)点菜展示表实现--利用哈希表作值的主要内容,如果未能解决你的问题,请参考以下文章