1. 题目来源
链接:5389. 点菜展示表
2. 题目说明
3. 题目解析
方法一:暴力+模拟+常规解法
真的是一道巨烦人的一个问题…思路如下:
- 利用
set
存所有菜品的名字,和桌号,充分利用它去重且排序的好处 - 开辟一个
map<string, int>
数组,数组里存放的是map
对象,表示菜名与份数的映射,数组维度表示哪一桌点的菜 - 需要字符串转数字,数字转字符串,像这种简单的问题,直接手撸就行了,撸多了就熟练了
- 清空各个容器
- 将菜名插入
set
,桌号插入set
,因为可以自动排序 - 统计桌号,菜数量,将其添加到
order
数组中。注意在此需要进行字符串转数字 - 生成二维表格,即申请一个二维
vector
,它的第一行是title
,首先得想向其内添加"Table"
,再向其内添加每种菜的菜名。 - 接下来生成每一行,需要按照桌号进行排序,这个在
set
内部已经自动的进行了处理。所以首先将桌号进行数字转字符串再插入到数组中,然后遍历order
对应桌号的所有菜的数量取出进行插入即可 - 该行处理完毕就将这个一维数组添加到二维结果数组当中
啊,难受,感觉一旦遇到这个大模拟又在竞赛的环境下真的很难静下心来处理这各种问题。在上面仔细梳理完毕后回想也不是很难,但缺少没在比赛中完成,或许工程能力很欠缺吧,大局观太差了点,不知道怎么设计数据架构来完成…唉…难受。
参见代码如下:
// 执行用时 :1092 ms, 在所有 C++ 提交中击败了100.00%的用户
// 内存消耗 :99.5 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
set<string> name;
set<int> table;
map<string, int> order[550];
string i2s(int x) {
if (x == 0) return "0";
string ret = "";
while (x) {
ret = (char)('0' + x % 10) + ret;
x /= 10;
}
return ret;
}
int s2i(string x) {
int ret = 0;
for (auto e : x) ret = ret * 10 + e - '0';
return ret;
}
vector<vector<string>> displayTable(vector<vector<string>>& data) {
name.clear(); table.clear();
for (int i = 0; i <= 500; ++i) order[i].clear();
for (auto e : data) {
name.insert(e[2]);
table.insert(s2i(e[1]));
order[s2i(e[1])][e[2]] += 1;
}
vector<vector<string>> ans;
vector<string> title;
title.push_back("Table");
for (auto e : name) title.push_back(e);
ans.push_back(title);
for (auto e : table) {
vector<string> row;
row.push_back(i2s(e));
for (auto n : name) row.push_back(i2s(order[e][n]));
ans.push_back(row);
}
return ans;
}
};