题目来源于知识星球—英雄算法联盟,七月算法集训专题
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
今天只有一道题奈!
一、1418.点菜展示表(中等)
1.题目描述
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.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!