五月集训(第22天)—有序集合

上次考试炸了,这周三门考试要好好复习,今天做了一题,先复习了,加油!

有序集合

1. 1418. 点菜展示表

    思路:
        这其实就是个模拟题,但是我没掌握map的用法,看着题解利用unoredered_setunordered_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 的最大数值和

    思路:
        等我考完试再宠信此题


posted @ 2022-05-22 06:39  番茄元  阅读(22)  评论(0)    收藏  举报