美團筆試(22 03 19)

2022-10-09 01:51:12 字數 2946 閱讀 1895

一共五道**題,看了前面三道,ac了三道,後面兩道題沒有時間看,此處將對前三題進行記錄總結,後附**。

題意:給定一組n個商品的**,下單購買商品時,必須購買前i個商品,即購買商品列表是商品列表的字首。提供兩種優惠規則,滿減優惠和折扣優惠,每次下單只能選擇某種優惠規則。問購買前i(1<=i<=n)個商品時,使用哪種優惠策略較優,或者兩者一樣優。

臨場解題思路:

購買前i個商品時,計算商品原**、商品折扣**、商品滿減**。那種策略優惠選擇哪種規則。

題目爭議:

購買20元商品,有10-5和15-1兩張優惠券,題目要求使用15-1的優惠券,過於離譜。(題目沒有說明,根據測試結果倒推的題意)

反思:滿減優惠券是按滿額從小到大排序的,商品**的字首和也是按從小達到排序的。遍歷商品**字首和陣列時,隨著付款總額越來越大,使用的優惠券滿額也會越來越大。針對這一點,遍歷字首和陣列的某個元素的時候,可以使用乙個變數記錄當前使用的優惠券下標,處理下乙個字首和元素時,優惠券下標必然大於等於上一次使用的優惠券的下標。

題意:給定字串s,可以選擇對字串進行加密或者解密。加密時,每次取原字串中間元素,加入加密字串的尾部,然後刪除中間的元素,重複著這一過程,知道原字串為空。解密時,按加密過程對加密字串反向操作還原出原始字串。

臨場解題思路:

加密:模擬加密字串過程,發現加密過程可以概括為從原始字串中間,使用兩個指標(left與right)分別向左與向右遍歷,左右交替遍歷元素並加入加密字串。

解密:反向操作,反向遍歷加密字串符,交替選擇字元加入字首字串和字尾字串,然後將字首字串和字尾字串拼接為原始字串。

題意:給定n個檔案,需要在兩台電腦之間同步。若使用者在a、b電腦上都修改了某些檔案,同步軟體會提示衝突。使用者現在a電腦上進行了修改,然後在b電腦上修改檔案,問有多少檔案修改出現衝突。使用者每次修改會影響多個連續檔案,使用乙個編號區間表示[l,r],題目給定a電腦上的m1個修改操作,與b電腦上的m2個修改操作。

臨場思路:

計算a電腦與b電腦修改檔案的重疊區間部分檔案個數。需要注意的是,a電腦上的多個修改區間會重疊,在計算a與b之間重疊檔案時,可能會引入對同一檔案重複計算的情況,需要對統一電腦的修改區間進行重疊區間的合併操作。

反思:可以基於集合計算,直接將a電腦修改的檔案編號放入集合中。然後遍歷b電腦修改的檔案編號,通過查詢集合是否出現該編號,即可判斷是否出現衝突,若衝突,累加衝突計數。該方法優點在於實現簡單,缺點在於使用更多的記憶體空間,每個檔案編號使用乙個整數儲存,對於區間表示法,可以通過兩個整數表示若干檔案。

#include using namespace std;

int m, n;

vectorpay, pay_z, pay_m;

vectorrule_c, rule_d;

void input();

int findrule(int val);

int main()

for (int i = 1; i < n; i++)

for (int i = 0; i < n; i++)

string res;

for (int i = 0; i < n; i++) else if (pay_z[i] < pay_m[i]) else

} cout << res;

return 0;

}int findrule(int val)

return left;

}void input()

for (int i = 0; i < n; i++)

cin >> m;

rule_c.resize(m);

rule_d.resize(m);

for (int i = 0; i < m; i++)

for (int i = 0; i < m; i++)

}

#include using namespace std;

int n, op;

string is, os;

string pre_str, back_str;

void op_one();

void op_two();

int main() else

cout << os;

return 0;

}void op_one()

while (left >= 0)

}void op_two()

} else

} reverse(back_str.begin(), back_str.end());

os = pre_str + back_str;

}

#include using namespace std;

int n, m1, m2;

vector> modi1, modi2;

void input();

int main() else if (modi1[i][0] > modi2[j][1]) else

} cout << ans;

return 0;

}void input()

for (int i = 0; i < m1; i++)

for (int i = 0; i < m2; i++)

for (int i = 0; i < m2; i++)

int idx1 = 1;

sort(modi1.begin(), modi1.end());

for (int i = 1; i < m1; i++) else

} modi1.resize(idx1);

int idx2 = 1;

sort(modi2.begin(), modi2.end());

for (int i = 1; i < m2; i++) else

} modi2.resize(idx2);

}

美團筆試2018 9 10

第一題 無向圖 def min path n,b node list 0 n 1 儲存節點的距離 for path in b 遍歷路徑,使後一節點距離值等於前一節點距離值加一 x,y path node list y node list x 1 depth 0 找到最大深度 for i in ran...

2015屆美團筆試

m個機器 n個任務,每個機器執行任務時的時間不同,如何分配任務讓機器排程使得總時間最短?如 2 個機器 6個任務 每個機器執行任務時間分別是10min和7min 假設3 3 分,需要max 30,21 30 假設4 2 分,需要max 40,14 40 假設2 4 分,需要max 20,28 28 ...

美團筆試題 拜訪

題目描述 現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,1代表不能經過的地區...