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