程式設計之法 面試和演算法心得 筆記

2021-08-03 08:45:06 字數 787 閱讀 8080

一、字串翻轉

三步反轉法,先將兩部分分別反轉,然後再整體反轉。

abcdef -> defabc

(1)cbadef // 旋轉前一部分;

(2)cbafed // 旋轉後一部分;

(3)defabc // 整個旋轉

那麼將「i am a student.」 -> "studnet. a am i",也類似。

二、字串的包含

a = "abcxyzlmnopreset"

b = "abxy"

a,b中只包含小寫字母。

如何判斷b中的字元都包含在字串a中 ?

hash,由於只有26個小寫字母,可以使用整數代替雜湊表。

先將a中字母放入雜湊表,再根據b中的字母進行判斷。

作者認為還不完美 ?是否要將b放入雜湊表,而使用a進行對比 ?

因為b的每個字母都必須被檢查到,最好的情況,可能比較少了a中字母就可以得出結果了,最壞的情況,a中字母都需要比較。

若包含任意字母的字串,如何處理?

三、字串的全排列

p = permutation, c = combination

排列有順序,組合無順序

p(n,m) = n! / (n-m)!

c(n,m) = n! / ( (n-m)! * m! )

c(n,m) = c(n, n-m)

迴圈排列數p(n,r) = n! / ( (n-r)! * r! ) 即,r個頭不涉及排序

程式設計之法 面試和演算法心得(奇偶調序)

輸入乙個整數陣列,調整陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。要求時間複雜度為o n 最容易想到的辦法是從頭掃瞄這個陣列,每碰到乙個偶數,拿出這個數字,並把位於這個數字後面的所有數字往前挪動一位。挪完之後在陣列的末尾有乙個空位,然後把該偶數放入這個空位。由於每碰...

程式設計之法 面試和演算法心得 最近公共祖先LCA問題

小結 暴力 tarjan演算法 是乙個找強連通分量的演算法。dfs 並查集,每次將兩個節點對的最近公共祖先的查詢儲存起來,然後dfs更新一次。複雜度 o n q q為查詢個數 rmq 沒看 但前面暴力求a i,j 最小值的位子可以考慮一下 1.普通的o n 3 2.動態規劃將為o n 2 線段樹 用...

程式設計之法 面試和演算法心得(最大連續子陣列和)

輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2,因此輸出為該子陣列的和18。求乙個陣列的最大子陣列和,我想...