美团--美团骑手包裹区间分组
生活随笔
收集整理的這篇文章主要介紹了
美团--美团骑手包裹区间分组
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
美團(tuán)–美團(tuán)騎手包裹區(qū)間分組
文章目錄
- 美團(tuán)--美團(tuán)騎手包裹區(qū)間分組
- 一、題目描述
- 二、分析
- 三、代碼
一、題目描述
2110年美團(tuán)外賣(mài)火星第3000號(hào)配送站點(diǎn)有26名騎手,分別以大寫(xiě)字母A-Z命名,因此可以稱(chēng)呼這些騎手為黃家騎士特工A,黃家騎士特工B…黃家騎士特工Z,某美團(tuán)黑珍珠餐廳的外賣(mài)流水線上會(huì)順序產(chǎn)出一組包裹,美團(tuán)配送調(diào)度引擎已經(jīng)將包裹分配到騎手,并在包裹上粘貼好騎手名稱(chēng),如RETTEBTAE代表一組流水線包裹共9個(gè),同時(shí)分配給了名字為A B E R T的5名騎手。請(qǐng)?jiān)诓淮騺y流水線產(chǎn)出順序的情況下,把這組包裹劃分為盡可能多的片段,同一個(gè)騎手只會(huì)出現(xiàn)在其中的一個(gè)片段,返回一個(gè)表示每個(gè)包裹片段的長(zhǎng)度的列表。
- 輸入描述:
- 輸出描述:
二、分析
- 這個(gè)問(wèn)題有點(diǎn)像求每個(gè)連續(xù)區(qū)間的長(zhǎng)度,而每個(gè)連續(xù)區(qū)間都是由小區(qū)間的覆蓋連接組合起來(lái)的,每個(gè)字母第一次和最后一次出現(xiàn)的位置構(gòu)成一個(gè)個(gè)小區(qū)間
- 所以我們可以先記錄每個(gè)字母最后一次出現(xiàn)的位置:
- 現(xiàn)在我們只需要遍歷一個(gè)個(gè)小區(qū)間即可
- 現(xiàn)在需要注意的問(wèn)題是我們知道了每個(gè)字符的最后一次出現(xiàn)的位置,但是在一個(gè)字符第一次出現(xiàn)的位置和最后一次出現(xiàn)的位置之間還可能出現(xiàn)其他字符
- 那么我們需要判斷在一個(gè)字符區(qū)間中間出現(xiàn)的字符最后一次出現(xiàn)的位置是否超過(guò)本次區(qū)間的最后一次出現(xiàn)的位置
三、代碼
#include <iostream> #include <vector> using namespace std;int divide(string S, int start, int end,int letterRight[26]) {//代表該字符所表示的區(qū)間左邊界int left = start;//代表該字符所表示區(qū)間的右邊界int right = letterRight[S[left] - 'A'];//遍歷該字符所表示的整個(gè)區(qū)間for (int i = left + 1; i <= right; i++){//如果出現(xiàn)該區(qū)間中間的字符所表示的區(qū)間的右邊界超過(guò)right//那么我們就需要更新right繼續(xù)判斷,從而獲得整個(gè)區(qū)間的長(zhǎng)度if (letterRight[S[i] - 'A'] > right) right = letterRight[S[i] - 'A'];}return right - left+1;}vector<int> partitionLabels(string S) {//保存每個(gè)字符最后一次出現(xiàn)的位置int letterRight[26];//保存每個(gè)區(qū)間的長(zhǎng)度vector<int> result;//統(tǒng)計(jì)每個(gè)字符最后一次出現(xiàn)的位置for (int i = 0; i < 26; i++){int t = S.find_last_of((char)( i + 'A'));letterRight[i] = t;}//字符所表示區(qū)間的開(kāi)始int start = 0; //字符所表示區(qū)間的結(jié)束int end = S.size(); //表示該小區(qū)間最終的長(zhǎng)度int tmp;while (start < end){//得到滿足題意:同一個(gè)字符只存在一個(gè)區(qū)間;的區(qū)間長(zhǎng)度//并保存到result當(dāng)中tmp = divide(S, start, end, letterRight);result.push_back(tmp);//注意注意??,一旦從前往后遍歷找到一個(gè)區(qū)間,一定要更新start的值//不一定再?gòu)南乱粋€(gè)位置繼續(xù)判斷,因?yàn)榭赡芟乱粋€(gè)字符的位置在區(qū)間的中間,//那么該字符肯定已經(jīng)被計(jì)算到區(qū)間長(zhǎng)度當(dāng)中,不用多次計(jì)算start += tmp;}return result; } int main() {string str;getline(cin, str);vector<int> result = partitionLabels(str);//打印結(jié)果for (int i = 0; i < result.size(); i++){cout<<result[i]<<" ";}return 0; }總結(jié)
以上是生活随笔為你收集整理的美团--美团骑手包裹区间分组的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。