[编程题]美团骑手包裹区间分组

今天接到了美团的笔试邀请,毕竟是人生中的第一次,感觉挺开心的,但是开心的同时伴随而来的是担心,没什么经验,不知道笔试这一关能不能通过。编程提到还好,就是那些问答题我真的不知道该怎么回答,感觉一脸懵。趁着这两天时间,好好地补一下吧。不知道为什么突然感觉自己好像什么都不会。是不是自己把太多的精力放在了写代码上面?

2110年美团外卖火星第3000号配送站点有26名骑手,分别以大写字母A-Z命名,因此可以称呼这些骑手为黄家骑士特工A,黄家骑士特工B…黄家骑士特工Z,某美团黑珍珠餐厅的外卖流水线上会顺序产出一组包裹,美团配送调度引擎已经将包裹分配到骑手,并在包裹上粘贴好骑手名称,如RETTEBTAE代表一组流水线包裹共9个,同时分配给了名字为A B E R T的5名骑手。请在不打乱流水线产出顺序的情况下,把这组包裹划分为尽可能多的片段,同一个骑手只会出现在其中的一个片段,返回一个表示每个包裹片段的长度的列表。


输入描述:

输入数据只有一行,为一个字符串(不包含引号),长度不超过1000,只包含大写字母'A'到'Z',字符之间无空格。


输出描述:

输出每个分割成片段的包裹组的长度,每个长度之间通过空格隔开


输入例子1:
MPMPCPMCMDEFEGDEHINHKLIN

输出例子1:
9 7 8

例子说明1:

划分结果为MPMPCPMCM,DEFEGDE,HINHKLIN。

每个骑手最多出现在一个片段中。

像MPMPCPMCMDEFEGDE,HINHKLIN的划分是错误的,因为划分的片段数较少。

思路:

先找包含全部第一个字母子串,若子串中其他的字母也都包含在这个子串中,则这就是一个满足要求的最短片段,否则再向后遍历使其满足要求。

Code:

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<set>

using namespace std;

int main() {
    string str;
    cin >> str;
    map<char, int> mp;
    for (int i = 0; i < str.length(); ++i) {
        mp[str[i]]++;
    }
    int start = 0, cur = 0, end;
    vector<int> ans;
    for (int i = 0; i < str.length(); ++i) {
        if (mp[str[cur]] == 0) {
            bool flag = false;
            for (int j = 1; j < i; ++j) {
                if (mp[str[j]] != 0) {
                    cur = j;
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                ans.push_back(i-start);
                start = i;
                cur = start;
            }
        }
        mp[str[i]]--;
    }
    ans.push_back(str.length()-start);
    if (!ans.empty()) {
        cout << ans[0];
    }
    for (int i = 1; i < ans.size(); ++i)
        cout << " " << ans[i];

    return 0;
}
永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/12657279.html