最近準備筆試的過程中,發現好多演算法題,有點套路的感覺,只怪自己平時積累不多,現在只能亡羊補牢了。
關於尺取法的概念我就不介紹了,網上這方面講解很多,主要說一些應用的方面,積累下目前遇到的一些可以用尺取法可以來解決的題目,不定期更新下。在此說明,我的夢想是進入網易,校招進入網易已經不可能了,我就在這裡立乙個誓言,將來一定會進網易尺取法參考部落格
沒想到曾經的網易,現在也因為"暴力拆遷"事件,而變得風聲鶴唳,網易就不指望了。
簡單可以理解為,所有求連續的一段區間的相關問題(比如求和,求差),都可以考慮下尺取法。注意,尺取法需要保證所有點按順序排列好,只能勇往直前,而不能後退。
尺取法要維護1:搜狗校招9月08號筆試題左右
兩個點,左邊這個點慢一些,右邊這個點走的快一些,兩個點間的尺
不能超過最大的臨界
,否則就要移動點。
題意:同乙個圓上面有n個點,n個點按照從小到大排列,每個點有乙個角度a(0<=a<=360),代表圓心角,問題是讓你求這些點構成的所有劣弧對應最大的圓心角(按劣弧來算,比如,10,193,圓心角就為177)
思路:這裡就以180為』臨界』,左右兩個點距離為』尺』,兩個點都從原點出發,順時針走,如果大於180,左點前進一位,如果小於180,右點向前進一位。因為圓是迴圈的,所以左邊這個點必須走遍圓中所有點,才能訪問完所有的最大的劣弧(注意,不需要訪問所有劣弧,只需要訪問所有最大的劣弧,這裡的最大,是指對於某個點來說的最大)。右邊的點在沒走完一圈之前,採用a[right]-a[left]計算,右點走完一圈之後,採用360-a[left]+a[right%n]來計算。**如下:
#include
#include
#include
#include
#include
using namespace std;
bool exp
(double a,
double b)
intmain()
double ans =-1
;int left=
0,right=0;
while
(leftelse
}else
else}}
printf
("%.8lf\n"
,ans)
;return0;
}/*410.00000000
180.00000000
183.00000000
198.00000000
310.00000000
180.00000000
190.00000000
*/
小優化:第一次尋找最大尺的時候,可以採用二分法。這個題必須是有序的,如果無序,需要先排序再操作,否則,不滿足變數遞增
的效果。
2.最長子區間問題
題意:要求求出最長連續子區間,區間要求所有值加起來,是k的倍數。例如,區間1,2,3,4,5,給出k=5,那麼滿足要求的區間有[1,2,3,4],[2,3],[1,2,3,4,5],顯然[1,2,3,4,5]最長
思路:這個題跟尺取法唯一相同點就是連續問題。需要記錄字首和。因為題目要求為最大,所以需要記錄第乙個出現該值的位置,再次出現該值時,說明從第一次出現到當前出現位置,所有數加起來為k的倍數。
memset
(dp,-1
,sizeof
(dp));
int temp=
0,ans=0;
for(
int i=
0;i)else
}printf
("%d\n"
,ans)
;
3.滴滴出行9月10號 xor問題
題意:給你一段區間,求出最大的滿足不重疊連續子區間的個數,子區間要求區間內所有數異或為0
參考部落格xor(滴滴筆試題)
思路:這裡和上面一道題目很像,不同的是本題要求的操作為異或。搞清楚一點:從左往右掃,滿足條件的第乙個區間,中間肯定沒有子區間滿足條件,所以這個區間一定構成最大子區間個數中的其中乙個(即使中間部分可能和後面的連續序列異或後滿足條件,也不在做計算,比如[4,3,2,4,3,2,3,2],[432432]為子區間[3232]也可以為子區間,但是一定不會選擇[3232],因為他所消耗的區間長度比[4,3,2,4,3,2]長,[3,2,3,2]相當於消耗了這一整個序列)。
這裡稍微說一下相似的題目,畢竟找工作,多拓展一點沒壞處。題目:求最大不相交區間的個數。
這個題採用貪心的演算法,要記錄下所有區間的left點和right點,然後根據right點的大小來排序,排序後從左往右找,
##後記:
還有一些尺取法的應用,都可以採用尺取法套路一下,後面再接著更新,如果有錯誤的地方,希望大家不吝賜教,畢竟本人小菜雞
面試演算法題總結 一
華為面試題 寫乙個程式,要求功能 求出用1 2 5 這三個數不同個數組合的和為100 的組合個數。如 100 個1 是乙個組合,5 個1 加19 個5 是乙個組合。請用c 語言寫。答案 最容易想到的演算法是 設x 是1 的個數,y 是2 的個數,z 是5 的個數,number 是組合數 注意到0 x...
面試演算法題總結 一
思想,每次隨機取乙個數,將大於其的放在右邊,小於或等於其的放在左邊,如此遞迴 def quicksort arr if len arr 1or len list filter lambda a a arr 0 arr len arr return arr middle random.choice r...
python面試演算法真題系列一
tips 答案在所有問題的後邊 簡單的字串排序 將字串按ascii的順序進行排序 注意,用例的輸入是input 輸入描述 cba 輸出描述 abc 示例1 輸入 cba 輸出abc 示例2 輸入 031fc 輸出 013cf 題2 字元對映 1 有乙個字元生成裝置,有按鈕1 9,其中每個數字對應多個...