師兄參加了華為的實習生招聘,我也蹭了一下熱鬧。
給出一組正整數,你從第乙個數向最後乙個數方向跳躍,每次至少跳躍1格,每個數的值表示你從這個位置可以跳躍的最大長度。計算如何以最少的跳躍次數跳到最後乙個數。
第一行表示有多少個數n
第二行開始依次是1到n個數,乙個數一行
輸出一行,表示最少跳躍次數。
輸入輸出
說明7表示接下來要輸入7個正整數,從2開始。數字本身代表可以跳躍的最大步長,此時有2種跳法,為2-2-2-5和2-3-2-5都為3步。
一開始看到這題就覺得難受,好麻煩的題目,師兄和我說是用動態規劃做,要寫出迭代方程什麼的。
仔細想過之後,想起運籌學中確實是這麼解這一類題的,不過那是把方案一起解出來了——也就是題中的「2-2-2-5和2-3-2-5」。可是題目要求的答案只是「最少跳躍次數」,並沒有說要給出方案,說明還是可以取巧的。
先整理一下規律,假設第i步到達了第k個位置(從0開始編號),那麼前面所有的位置應該都能在第i步或第i步之前到達,在下圖中標為橙色。
下面開始走一邊用例。第0步,此時能到達的點就是起點,所以也就第乙個點被標記。同時可以計算出下一step能到達的最遠位置為2(第乙個格仔的位置0 + 該格中的數字2),也就是從左到右數第3個格仔,接下來把能到達的格仔塗色。
更進一步。在橙色區域迴圈,計算出下一步最遠能到達的點,第二個格仔和第三個格仔都符合要求,繼續把能到達的格仔標為橙色。
那麼什麼時候可以停止迴圈呢?很簡單,只要最後乙個格仔變成橙色就結束迴圈了,也就是step_max >= n-1。
當然,當step=3時,就得到想要的結果了,此時也知道了最少需要跳躍3次才能到達終點。
以上的式子都是基於從0編號這一條件的,所以程式設計時我也從0開始編號。
就直接貼上**啦
#include #include using namespace std;
int main()
// 迴圈,當到達末尾時跳出迴圈
int step = 0;
int out = 0;
int step_max = 0;
while (true)
} out = step_max;
if (out + 1 >= len)
} // 輸出結果
cout << step << endl;
system("pause");
return 0;
}
華為實習生面試經歷
下午兩點二十的面試,早上七點過就起了,吃了個愉快的早餐,9點就出發了。十一點半到了華為,姐夫接了我,帶我逛了逛華為,吃了頓午飯,就去一號門排隊面試了。排隊排到了4點,終於輪到我了,等待的時候還碰到了兩位本校研究生部的學長,其中一位筆試582,沒有滿分是因為看錯了乙個需求 面試就兩場,一場是技術面,一...
cvte c 實習生面試題目
這個面試是 面的,一開始問了有關的專案經歷之後就開始問以下的這些問題,整個面試過程大約30分鐘。在c 中,源程式變為可執行程式的正確順序 虛函式,純虛函式,多型性 函式過載 堆疊智慧型指標 種類,實現原理 malloc free和 new delete的區別 c和c 的區別 常見的stl函式 如何寫...
華為通用軟體開發實習生面試題
技術面手撕 的原題 要求用c 寫 樓主比較菜面試時候又比較緊張面試官又看著我寫,因此當場只寫出來乙個通用的解法,本以為面試官會讓我優化時間複雜度,結果沒有,只是測試了一下我的 每個測試點都通過了 我的想法是,因為要求最大公共字首嘛,結果肯定不可能比這些字串中最短的長,所以首先求出最短的字串長度假設長...