64,077
社区成员
发帖
与我相关
我的任务
分享
1418. 点菜展示表
解题思路:
因为一张桌子上面有很多道菜,每道菜的数量又有不同。所以我们可以构建一个桌子的哈希表(键为桌号,值为该桌子菜品的名称和数量),我们还需要表示菜品的名称和数量,所以我们又可以用一个哈希表来表示一个菜品的名称和数量(键为菜品名,值为数量)。综上我们就构建了一个二重的哈希表。再把菜品名称记录下来,桌号记录下来用来构建返回结果。
class Solution {
int string2int(string s) {
int sum = 0;
for(char c: s) {
sum *= 10;
sum += c - '0';
}
return sum;
}
public:
vector<vector<string>> displayTable(vector<vector<string>>& orders) {
unordered_set<string> menu;
unordered_map<int, unordered_map<string, int>> hash;
for(auto& it: orders) {
menu.insert(it[2]);
int tableid = string2int(it[1]);
++hash[tableid][it[2]];
}
//获取菜名
vector<string> name;
for(auto& n: menu) {
name.push_back(n);
}
sort(name.begin(), name.end());
//获取桌号
vector<int> tableID;
for(auto& [id, n]: hash) {
tableID.push_back(id);
}
sort(tableID.begin(), tableID.end());
vector<vector<string>> ret(hash.size()+1, vector<string>(menu.size()+1));
ret[0][0] = "Table";
copy(name.begin(), name.end(), ret[0].begin() + 1);
for(int i = 0; i < hash.size(); ++i) {
int id = tableID[i];
ret[i + 1][0] = to_string(id);
auto cnt = hash[id];
for(int j = 0; j < menu.size(); ++j) {
ret[i+1][j+1] = to_string(cnt[name[j]]);
}
}
return ret;
}
};