五月集训(第22天)—有序集合
上次考试炸了,这周三门考试要好好复习,今天做了一题,先复习了,加油!
有序集合
1. 1418. 点菜展示表
思路:
这其实就是个模拟题,但是我没掌握map
的用法,看着题解利用unoredered_set
和unordered_map
边抄边理解,算是写完了。
class Solution {
public:
int string2int(const string& str) {
int i;
int sum = 0;
int len = str.length();
for (i = 0; i < len; i++) {
sum = sum * 10 + (str[i] - '0');
}
return sum;
}
vector<vector<string>> displayTable(vector<vector<string>>& orders) {
// 获取餐品名称和桌号,统计每桌点餐数量
unordered_set<string> nameSet;
map<int, unordered_map<string, int>> foodCnt;
for (auto &order : orders) {
nameSet.insert( order[2] );
int idx = string2int(order[1]);
++foodCnt[idx][order[2]];
}
// 提取餐品名称,按字母顺寻排列
int n = nameSet.size();
vector<string> names;
for (auto &name : nameSet) {
names.push_back(name);
}
sort(names.begin(), names.end());
// 提取桌号,并按餐桌桌号升序排序
int m = foodCnt.size();
vector<int> ids;
for (auto &[id, _] : foodCnt) {
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 = foodCnt[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;
}
};
2. 363. 矩形区域不超过 K 的最大数值和
思路:
等我考完试再宠信此题
东方欲晓,莫道君行早。