一共五道**題,看了前面三道,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代表不能經過的地區...