本文由 楊珏成 首發於 SegmentFault,未經許可請勿轉載
原文連接:segmentfault.com/a/119000002…php
我就讀於北京理工大學軟件工程專業,是一名大四學生。從大一開始投入之前端爲主的全棧開發,獨立開發過多箇中型和小型項目,是 佬鐵|宿舍市集 小程序的社區創始人及獨立項目負責人。css
在學校裏讀書的時候,我就是一個閒不住的人。最近由於一個偶然的契機,接觸到了校招季,最後定下了本科畢業就工做的規劃目標。html
因而我在一個月的時間裏參加了9家國內大廠校招,收穫了以下結果(截至2019年9月5日):前端
從一開始手指冒汗被懟的說不出話,到最後和麪試官侃侃而談遊刃有餘,我發現:一樣的能力水平,在不一樣的面試表現下,反饋到面試官眼中的結果能夠有着天壤之別。vue
所以,若是你但願把本身的真實水平展現給面試官,那麼掌握一些合適的方法是很是有必要的。node
正文的內容聚焦於應聘大廠校招所需具有的能力,以及分析各個大廠具體的校招策略。分爲兩個部分:python
但願能爲第一次走上職場的同窗們提供參考,也是對本身過去數週奔波忙碌的一個總結。mysql
這裏必定要在開頭強調一下內推,引用一下知乎@Tony的回答:react
內部推薦極可能會加速你的申請過程,但很小可能增長你被錄取的成功率。jquery
天天投簡歷到Google的人是不少不少的。HR天天要當作千上萬份經過網上遞交的簡歷,看到你的那份時都不知道猴年馬月了。況且,你真的肯定你的簡歷能在上萬份簡歷裏stand out?
這時內推就能幫你了。內部規定HR必須在收內推的一週內查看你的簡歷,必須在兩週內給出答覆。換句話說,你算是插隊了。
但是這不能提升你被錄取的成功率,實力不行的人也只是插隊被拒。整個面試和普通流程都是同樣的。最終決定錄取與否的始終是你的背景,能力,和麪試表現。
就像Web開發的layout,寫簡歷時也應該考慮本身的簡歷佈局。怎樣劃分簡歷內容板塊,我的信息是居中仍是居左,頭像應該和我的信息一塊居中仍是和我的信息對稱放置。建議參考身邊學長或者hr發的簡歷模板。
這裏以個人簡歷爲例,供感興趣的同窗查看
寫簡歷切忌一股腦把本身的驕傲倔強都寫上去,這樣只會讓面試官看不懂你的簡歷。
先把本身的所有簡歷素材整理成一個文本庫,再根據應聘的不一樣職位精心挑選出與崗位匹配的簡歷內容,其中以相關性最高,最能突出我的能力的經歷爲先。這裏推薦一個技術簡歷的最佳實踐:
筆試沒有什麼竅門,我我的會刷Leetcode。要是能刷100道基本上面試題就不用愁,要是刷到200道就不用害怕校招筆試了。
我在附錄2
中記錄了本身遇到的一些筆試題,僅供參考。
任何人在第一次面對面試官的時候都會緊張,即便參加了多場面試,依然會在有的時候感受控制不住本身的狀態。克服這種緊張感,你就已經比多數面試者成功了一小半。
面試官永遠都喜歡你臨危不亂,面對難題依然可以掌握大局的樣子。而且在將來任何場合都是如此。
如何克服緊張,我這裏提供兩點建議
面試的時候,面試官老是喜歡出一些看起來很刁難的問題:實現一個Vue雙向綁定,寫一個公平的洗牌算法,寫一個css走馬燈樣式,獲取某個字符串的全排列,寫一個class的polyfill等等。
或者是深挖你的項目經歷一步步追問技術細節,讓你現場考慮如何實現更好的效果。
這種時候,你要意識到面試官是在考驗你的邏輯思惟,面試官的目的不是要你給出一個絕對完美的解決方案,而是想看到你如何運用一套好的邏輯思惟來調用本身的知識庫,最終給出你本身的思考路徑。最重要的是這個過程當中間的思考,必定要闡述給面試官。
接下來是整個面試中90%時間在乾的事情,也就是對你的技術儲備與工程能力的考覈。
通常來講,大廠的前端校招會比其餘中小企業更看重對面試者的全方位考覈,若是你是科班出身,校招的技術考覈會包括且不限於:
另外,不一樣的大廠也有不一樣的側重點。
技術實力最頂尖的阿里淘系FED會對你的基礎知識體系以及你簡歷上寫到的技能展開一場慘絕人寰的刨根問底,而字節跳動則更看重你的實際工程經驗以及對於軟件系統架構的理解。
經過每家大廠的面試策略,你也能夠側面觀察出這家企業的團隊技術實力和業務發展方向。
我將技術面中遇到的全部知識點整理成了一張思惟導圖。建議一條一條仔細查閱,對於任何沒有百分百把握的知識點,我都建議你把它整理到一個列表裏,逐條梳理。
PS.標星的是非必須知識,能夠略過:
對於不想看圖的同窗,我把它導出成了一份大綱,能夠收藏到備忘錄裏。
若是你經過了以上全部考覈的話,恭喜你,你離得到offer基本只剩一步之遙了。
通常到這個時候,面試官會問你對本身的職業規劃。
這個問題其實也是須要本身問題本身的,最好在投遞簡歷的時候就想清楚:
仍是那句話 —— 不想當架構師的前端不是好程序員(霧)。
若是面試沒有覆盤,你參加再多的面試也和沒有參加同樣。不要嘆息面試中出的洋相或者咒罵面試官有多麼反人類,無論多麼受傷都要在面試結束後馬上覆盤。
現場面試最好一齣場就開始回憶面試流程&寫備忘錄,若是是電話面試能夠錄音下來重聽一邊,捋一捋面試官的問題和本身的回答,看看本身答得如何(答成了什麼b樣),有沒有可能答得更好。
我在附錄1
中記錄了每次參加校招時的覆盤。
這裏原本想仔細量化評測一下各家大廠面試流程中的面試體驗,遺憾的是有些面試已通過去一段時間了,印象不是那麼清晰,我擔憂個人評價會有失偏頗。因此就簡單說一下在各家面試過程當中讓我印象深入的一些事情吧。
字節會給參加面試的每一個人發一個包含抖音帽子在內的小禮包,還有一袋早餐,中午還有免費的自助午飯供應,很是貼心了
B站的老哥在問我爲何選擇B站的時候,補充了一句「除了二次元情懷以外」
阿里淘系FED的每一輪面試都是突襲電話面試,分別在我睡覺、飛翔、吃飯的時候打了進來,每一輪平均時間90分鐘,並且會提早告訴你面試的目錄……(具體能夠看附錄1裏的 # 6.8 阿里校招二面
)
騎着摩拜單車去美團摩拜總部的大樓參加了摩拜單車小程序開發的面試
在字節認識了一個很逗的學弟和一個很可愛的負責飛聊的小姐姐
騰訊的內推仍是挺重要的,否則面試官可能看不到你
上面這條對於多數大廠都適用
上面這條不適用於字節
很是但願騰訊和阿里的小哥哥看到這裏不會掛掉我
最近看到一篇文章《前端深水區》感觸頗深,技術崗的最終出路必定是創建技術壁壘和影響業務決策。
在面試B站的時候,也遇到了一個讓我陷入了思考的問題,面試官當時問我:「我對你的職業規劃印象很好,你打算怎樣去實現它呢?我給你一分鐘的時間仔細思考這個問題。」
最後我回答了三句話:
保持進取
保持客觀
天天堅持探索最佳實踐
與你們共勉。
符號 | 含義 |
---|---|
√ | 現場回答正確 |
× | 現場回答錯誤 |
? | 現場沒法判斷是否答對 |
追問 | 對於父問題的追問 |
() | 我在面試現場的回答思路 |
()右邊 | 最合適的回答(或對現場回答的補充) |
補充 | 面試官親自對現場回答的補充 |
問 | 我向面試官提出的問題 |
PS. 並非全部試題都包含以上符號,由於都是現場回憶記錄,因此有不少不全的地方。
html
css
js
www.toutiao.com
轉爲com.toutiao.www
√輸入:[1, 2, [3, 4], 5, 6, [7, 8], 9]
輸出: [[3, 4, 1, 2, 5, 6][7, 8 ,9]]
複製代碼
輸入:contentType
輸出:content_type
複製代碼
坑點:沒有準備耳機,視頻面試官聲音比較小,一開場亂了節奏
小明和小紅用字符串壓縮通訊。 字符串壓縮規則是:若是有連續重複的字符串好比ABCABCABC就縮寫成[3|ABC]。 現有壓縮後的字符串,設計一個解壓程序還原字符串。
輸入:
HG[3|B[2|CA]]F
輸出:
HGBCACABCACABCACAF
複製代碼
須要優化內存,我之因此87.5就是由於內存溢出MLE了,正在考慮用棧結構重寫一次。
string decode(string s) {
string res = "", ans = "";
int len, start , end;
int time, counting;
time = 0, counting = 1;
len = s.size();
for (int i = 0; i < len; i++)
{
if (s[i] == '[')
{
start = i;
for (i = len; s[i] != ']'; i--);
end = i;
res += decode(s.substr(start + 1, end - start - 1));
i++;
}
if (counting && s[i] >= '0' && s[i] <= '9')
{
time = time * 10 + (s[i] - '0');
}
else if (s[i] == '|')
{
counting = 0;
}
else
{
res += s[i];
}
}
char tmp = res[res.size() - 1];
if (tmp == '\0')
{
res = res.substr(0, res.size() - 1);
}
if (time > 0)
{
for (int i = 0; i < time; i++)
{
ans.append(res);
}
}
else
{
ans = res;
}
return ans;
}
int main()
{
string s;
cin >> s;
cout << decode(s) << endl;
return 0;
}
複製代碼
判斷一個ip地址是否是私有的 已知私有IP範圍是:
10.0.0.0 - 10.255.255.255
172.16.0.0-172.16.255.255
192.168.0.0-192.168.255.255
127.0.0.0/8 # 注意!這裏是一個巨坑,0/8的意思表明子網掩碼255.255.255.0,也就是最後8位能夠有動態範圍,這是一種簡寫方法,可是騰訊並無說明其含義,可能也是一處考察。
複製代碼
輸入:
0.0.0.0
輸出:
false
複製代碼
function isPrivate(ip){
// TODO
let ipVal = ip.split('.');
ipVal[0] = Number(ipVal[0]);
ipVal[1] = Number(ipVal[1]);
ipVal[2] = Number(ipVal[2]);
ipVal[3] = Number(ipVal[3]);
if (ipVal[0] == 10) {
if (ipVal[1] >= 0 && ipVal[1] <= 255) {
if (ipVal[2] >= 0 && ipVal[2] <= 255) {
if (ipVal[3] >= 0 && ipVal[3] <= 255) {
return true;
}
}
}
}
if (ipVal[0] == 172) {
if (ipVal[1] >= 16 && ipVal[1] <= 31) {
if (ipVal[2] >= 0 && ipVal[2] <= 255) {
if (ipVal[3] >= 0 && ipVal[3] <= 255) {
return true;
}
}
}
}
if (ipVal[0] == 192) {
if (ipVal[1] == 168) {
if (ipVal[2] >= 0 && ipVal[2] <= 255) {
if (ipVal[3] >= 0 && ipVal[3] <= 255) {
return true;
}
}
}
}
if (ipVal[0] == 127) {
if (ipVal[1] == 0) {
if (ipVal[2] == 0) {
if (ipVal[3] >= 0 && ipVal[3] <= 8) {
return true;
}
}
}
}
return false;
}
複製代碼
把一個由 - 或 _ 或 @ 鏈接的變量詞組轉換成駝峯寫法
輸入:
content-type
輸出:
contentType
複製代碼
function camel(str) {
// TODO
let ans = "";
let upper = false;
for (let index = 0; index < str.length; index++) {
const element = str[index];
if (element == '_' || element == '-' || element == '@') {
upper = true;
} else {
if (upper) {
ans += element.toUpperCase();
} else {
ans += element;
}
upper = false;
}
}
return ans;
};
複製代碼
企鵝星球上一天有N(<200000)個小時(時間不包含0點),對應N個時區,當第1時區一點的時候第2時區已經兩點了,以此類推 每一個時區有Ai我的,每一個時區上的人只有在[u,v)時間內有空,如今想要讓儘量多的人開會,給出開會時第一時區的時刻
輸入:
3
2 5 6
1 3
輸出:
3
複製代碼
時區的對應有一點繞,我一開始理解成後一個時區比前一個時區落後,其實是超前的,每後一個時區比前一個時區快1個小時,解決掉這個問題就沒有大問題了。 另外要考慮一下時間複雜度的問題,個人優化比較差,最壞複雜度是O(n2/2)
int main() {
int n, u, v, len, pos;
long long ans, tmp;
cin >> n;
vector<int> a(n, 0);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
cin >> u >> v;
u--;
v--;
len = v - u;
pos = 0;
if (len < n / 2)
{
ans = 0;
for (int i = 0; i < n; i++)
{
tmp = 0;
for (int j = 0; j < len; j++)
{
tmp += a[(i + j) % n];
}
if (tmp > ans || (tmp == ans && ((n + u - pos) % n < (n + u - pos) % n)))
{
ans = tmp;
pos = i;
}
}
}
else
{
ans = INF;
for (int i = 0; i < n; i++)
{
tmp = 0;
for (int j = 0; j < n - len; j++)
{
tmp += a[(i + j) % n];
}
if (tmp < ans || (tmp == ans && ((n + u - pos) % n < (n + u - pos) % n)))
{
ans = tmp;
pos = i;
}
}
}
cout << (n + u - pos) % n + 1 << endl;
return 0;
}
複製代碼
第一題的思路比較簡單,就是展轉相除法,用字符串存儲大數,而後分段展轉相除
展轉相除法:
假若有兩個正整數p1,p2,其中p1>p2,那麼必然存在兩個天然數k,b,使得p1=k*p2。 若是p1,p2的最大公約數是p3,那麼p2,b的最大公約數也是p3。 例如gcb(55,30)=gcb(25,30)=gcb(25,5)
題目:在一個最大長度200000的數組中,分別求出長度從1到n的子序列中最大值的最小值
輸入:
6
1 8 7 5 4 2
輸出:
1 4 5 7 8 8
複製代碼
簡單來講,就是把一個數組進行連續子序列的劃分,從長度爲1的子序列開始劃分,每次劃分子序列後,求出每一個子序列的最大值,再求出全部這些最大值中最小的那個,一直到長度爲n的子序列(序列自己)。
這題一開始把我看繞了,其實就是一道標準的DP題,然而我最後作的這題,考完才寫出來。。。此次筆試基本是按照最差的答題順序來的,估計跪了。
狀態轉移方程能夠這樣想出來:
設dp[j][i]
是從數組第j
個數字開始的長度爲i
的子序列的最大值,當長度i=0(實際長度應該爲1,從0開始方便些)時,dp[j][0]
等於數字自己num[j]
,從i=1開始,dp[j][i]的長度等於MAX(dp[j][i-1], dp[j+1][i-1])
也就是先後相鄰的兩個長度爲i-1的子序列最大值中的最大值。
這題要求的是同一劃分長度下全部最大值的最小值,因此在計算dp數組的同時還要計算這個值是否爲當前劃分長度的最小值,因而定義一個min數組,長度100000,先初始化成最大數值,每次計算dp[j][i]
的時候與min[i]
比較哪一個值更小,一趟下來就能獲得最小值了。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define INF 0x7FFFFFFF
using namespace std;
int num[100000] = { 0 };
int (*dp)[100000];
int main()
{
int n;
int min[100000] = { 0 };
scanf("%d", &n);
dp = (int (*)[100000])malloc(n * 100000 * sizeof(int));
for (int i = 0; i < n; i++)
{
scanf("%d", &num[i]);
min[i] = INF;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i; j++)
{
if (i == 0)
{
dp[j][0] = num[j];
}
else
{
dp[j][i] = MAX(dp[j][i - 1], dp[j + 1][i - 1]);
}
if (dp[j][i] < min[i])
{
min[i] = dp[j][i];
}
i = i;
}
}
for (int i = 0; i < n; i++)
{
if (i>0)
{
printf(" ");
}
printf("%d", min[i]);
}
printf("\n");
return 0;
}
複製代碼
一個數組中,奇偶數可互換,求任意次互換後字典序最小的數組序列。
我的思路:沒有特別好的想法
給定一個長度M(<=100000)的數組,而後輸入N(<=100000)個整數,每次將數組中全部大於等於該整數的元素減一,並輸出改變了多少個元素,要求時間性能小於1s。
用二分查找結果70%結果都TLE了,通過分析認爲主要是遍歷數組進行減一的操做太費時間(O(n^2)的複雜度)後來考慮用一個數組儲存更新過的下標分界位置來繞過遍歷減一的環節,然而沒寫完。
給定暑假時間X天(<=1000),遊戲數量N個(<=11),接下來N行給定每種遊戲須要花費的天數(Ai),以及通關該遊戲帶來的成就點數(Bi),求:在暑假X天裏可以達成的最高成就點數。
#include <iostream>
#include <vector>
#include <cassert>
#include <algorithm>
using namespace std;
// 須要填充一個容量爲X的揹包,使得成就點數最大
class Knapsack01 {
private:
vector<vector<int>> memo;
// 用 [0...index]的物品,填充容積爲c的揹包的最大價值
int bestValue(const vector<int> &w, const vector<int> &v, int index, int c) {
if (c <= 0 || index < 0)
return 0;
if (memo[index][c] != -1)
return memo[index][c];
int res = bestValue(w, v, index - 1, c);
if (c >= w[index])
res = max(res, v[index] + bestValue(w, v, index - 1, c - w[index]));
memo[index][c] = res;
return res;
}
public:
int knapsack01(const vector<int> &w, const vector<int> &v, int C) {
assert(w.size() == v.size() && C >= 0);
int n = w.size();
if (n == 0 || C == 0)
return 0;
memo.clear();
for (int i = 0; i < n; i++)
memo.push_back(vector<int>(C + 1, -1));
return bestValue(w, v, n - 1, C);
}
};
int main() {
// X爲暑假天數,N爲遊戲數量
int X, N;
cin >> X >> N;
int w, v;
// vs存的是價值(成就點數)
// ws存的是每一件物品的重量(天數)
vector<int> vs, ws;
for (int i = 0; i < N; i++) {
cin >> w >> v;
vs.push_back(v);
ws.push_back(w);
}
cout << Knapsack01().knapsack01(ws, vs, X) << endl;
return 0;
}
複製代碼
PS.這題我特麼寫成徹底揹包了,實際上是01揹包,結果只對50%。
輸入指令集長度M和指令操做長度N 接下來輸入M個指令(字符串)=》指令值(字符串)的映射關係 而後隨機輸入N個指令,要求輸出對應指令值。
最簡單的用c++ map容器,然而忘記map寫法,耽誤大量時間,超級遺憾。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
map<string, string> ops;
int x, y;
cin >> x >> y;
for (int i = 0; i < x; i++)
{
string a, b;
cin >> a >> b;
ops[a] = b;
}
for (int i = 0; i < y; i++)
{
string op;
cin >> op;
cout << ops[op] << endl;
}
}
複製代碼
給定N塊錢,M種水果,每種水果價格Pi,其中有X種特別喜歡的水果,給定不一樣水果喜歡程度的排序,並要求排序靠前的水果購買量不得小於靠後的,求全部把錢花光的可能性,結果對10000007取模。
跪了...
小明定了n個鬧鐘,他只能在鬧鐘響起時出發去學校,每一個鬧鐘時間分別爲hi點mi分,小明家到學校要x分鐘,學校上課時間a點b分 (0-24小時,0-59分鐘),求他最晚幾點起
輸入:
3 //定了幾個鬧鐘
5 0 //第1個鬧鐘的小時數和分鐘數
6 0 //第2個鬧鐘的小時數和分鐘數
7 0 //第3個鬧鐘的小時數和分鐘數
59 //到學校要多少分鐘
6 59 //上課的小時數和分鐘數
輸出:
6 0 //最晚的起牀時間
複製代碼
純智障思路,自定義結構體存儲鬧鐘時間,所有輸入後對鬧鐘時間從晚到早排序,接下來從前日後遍歷鬧鐘時間,計算從當前時刻出發到學校的時間,輸出第一個可以到達學校的,因爲算法很粗劣,很明顯被卡邊界了,沒時間管了直接看下一題。
struct Time
{
int h;
int m;
friend bool operator < (Time a, TIme b){
if(a.h == b.h){
return a.m > b.m;
}
return a.h > b.h;
}
}
int main()
{
int n, x, a, b, rest;
cin >> n;
Time* time = (Time*)malloc(n * sizeof(Time));
for (int i = 0; i < n; i++)
{
cin >> time[i].h >> time[i].m;
}
sort(time, time + n);
cin >> x;
cin >> a >> b;
for (int i = 0; i < n; i++)
{
rest = 0;
if (time[i].h < a || time[i].h == a && time[i].m < b)
{
rest = (a - time[i].h) * 60 + b - time[i].m;
if (rest >= x)
{
cout << time[i].h << ' ' << time[i].m << endl;
break;
}
}
}
return 0;
}
複製代碼
小明和小紅採用密碼加密通訊,每次通訊有固定的明文長度n和加密次數k。 好比:密碼二進制明文是1001010,加密次數是4,則每次將密文右移1位與明文作異或操做,總共位移3次(k=4, 因此k - 1 = 3)
輸入:
7 4 // n k
1110100110 //密文
輸出:
1001010 //明文
解釋:
1001010---
-1001010--
--1001010-
---1001010
複製代碼
加密次數爲4,故對於明文右移4-1=3輪,每輪與當前密文進行一次異或,故1001010對應密文爲1110100110
一道標準的異或數學題,不知道該怎麼歸類,有一點考數學的感受,看幾眼就能看出規律了直接上代碼
簡單講一下思路:
首先密文和明文第1位是同樣的,看一下上方樣例裏的解釋就懂了。 而後考慮第2到k-1位,能夠發現這一段的每一位都是由前一位密文的異或結果再與當前位明文異或獲得的。
接下來考慮第k到n-1位,觀察規律能夠發現這一段的每一位都是由前一位密文與第i-k位明文異或獲得的結果再與當前位明文異或獲得的。 如何消除異或影響你們應該都能理解,所以只要把參與異或的部分再與密文異或一下便可獲得明文。
int main() {
int n, k, tmp;
string s,ans="";
cin >> n >> k;
cin >> s;
ans += s[0];
for (int i = 1; i < k; i++)
{
tmp = (int)(s[i] - '0') ^ (int)(s[i - 1] - '0');
ans += tmp + '0';
}
for (int i = k; i < n; i++)
{
ans += (int)(s[i] - '0') ^ (int)(s[i - 1] - '0') ^ (int)(ans[i - k] - '0') + '0';
}
cout << ans;
return 0;
}
複製代碼
王大錘要給員工發工資,員工從左到右坐成一排,每一個員工知道彼此的資歷,每一個員工只知道本身左右員工的工資,若是某員工比左邊或右邊的人資歷老,那他必定比這我的工資高100元,每一個人最低工資100元,求王大錘最低給多少工資。
輸入:
4 //幾個員工
3 9 2 7 //員工順序以及對應的資歷
輸出:
600 //100元,200元,100元,200元
6
1 2 3 4 5 6
2100 //100,200,300,400,500,600
5
1 1 1 1 1
500 //100,100,100,100,100
8
1 2 3 4 3 2 3 4
1800 //100 200 300 400 200 100 200 300
8
3 4 3 4 3 4 3 4
1200 //100 200 100 200 100 200 100 200
5
1 2 3 4 1
1100 //100 200 300 400 500
複製代碼
廣度優先搜索,能夠把員工序列看做一棵多根樹,每一個工資最低的員工就是根節點,一個員工的工資其實就是他在多根樹裏的深度,
首先在輸入的時候找到比左右資歷都年輕的員工入隊,每次從隊列pop一個員工,而後判斷該員工的最小工資,而後判斷左右員工是否能夠入隊,直到全部員工出隊
int main() {
int n, now;
long long ans = 0;
cin >> n;
if (n == 0)
{
cout << 0 << endl;
return 0;
}
vector<int> epy(n, 0), depth(n, 0);
queue<int> sal;
for (int i = 0; i < n; i++)
{
cin >> epy[i];
if (i > 1 && epy[i - 1] <= epy[i - 2] && epy[i - 1] <= epy[i])
{
depth[i - 1] = 1;
sal.push(i - 1);
}
}
if (epy[0] <= epy[1])
{
depth[0] = 1;
sal.push(0);
}
if (epy[n - 1] <= epy[n - 2])
{
depth[n - 1] = 1;
sal.push(n - 1);
}
while (!sal.empty())
{
now = sal.front();
int left = (now > 0 && epy[now-1] < epy[now]) ? depth[now - 1] : 0;
int right = (now < n - 1 && epy[now + 1] < epy[now]) ? depth[now + 1] : 0;
sal.pop();
if (depth[now] == 0)
{
depth[now] = max(left, right) + 1;
}
//left
if (now > 0 && depth[now - 1] == 0 && (now == 1 || epy[now - 2] > epy[now - 1] || depth[now - 2] > 0))
{
sal.push(now - 1);
}
//right
if (now < n - 1 && (depth[now + 1] == 0) && (now == n - 2 || epy[now + 2] > epy[now + 1] || depth[now + 2] > 0))
{
sal.push(now + 1);
}
}
for (auto salary : depth) {
ans += salary;
}
cout << ans * 100 << endl;
}
複製代碼