面試常見演算法題
A. 秋招面試經典演算法練習-第二十八天-正則表達式匹配問題
秋招面試中,正則表達式匹配問題是經典演算法練習之一。每日堅持刷題有助於提升編程技巧和面試應對能力。今天,我們來深入理解並解決一道涉及'.'
和'*'的正則表達式匹配問題。
題目要求實現一個函數,處理包含 '.' 和 '*' 的模式。'.' 表示任意字元,'*' 表示前面的字元可出現任意次。目標是判斷給定字元串 str 是否能被模式 pattern 完全匹配,如 "aaa" 與 "a*a" 和 "ab*ac*a" 匹配,但不包括 "aa.a" 和 "ab*a"。
示例1中,輸入 "aaa" 和 "a*a",由於 '*' 可以匹配任意次數的 'a',結果應為 true。在示例2 "aad" 和 "c*a*d" 中,'*' 表示前面的字元可以為0次,所以匹配成功。
解題思路是採用動態規劃,定義 dp[i][j] 表示 str 前 i 個字元和 pattern 前 j 個字元是否匹配。初始化時,空串匹配,dp[0][0]=true。遍歷 pattern,處理 '*' 的特殊情況,dp[0][i] 可能等於 dp[0][i-2],表示 '*' 可以匹配0次前一個字元。
狀態轉移方程考慮字元不為 '*' 的簡單情況和 '*' 出現時的匹配規則,根據 dp[i-1][j-1] 或 dp[i][j-2] 來更新 dp[i][j]。通過畫圖理解演算法,可以更好地掌握動態規劃過程。
最後的總結強調了演算法練習的重要性,無論對於初學者還是資深開發者,刷題都是提升技術的關鍵。通過反復訓練、設定時間限制和總結反思,我們可以更好地掌握基礎演算法,解決實際問題,從而在面試中脫穎而出。
B. 14道常見的 操作系統 面試題
1. 進程與線程的區分
進程是操作系統分配資源的核心單元,每個進程都承載一個特定功能的程序,針對數據集執行一次獨立運行,獨立擁有CPU和內存等資源。而線程則是進程內的執行實體,雖然它不直接佔用系統資源,但與進程共享同一份資源。簡言之,進程是資源分配的基石,線程則是執行的輕量級單元。
2. 面試題:頁面置換演算法
頁面置換演算法是操作系統中的關鍵策略,包括FIFO(先進先出,適合簡單調度)、LRU(最近最少使用,依據使用時間)、LFU(最少使用次數,關注頻率)、以及理論最優的OPT,它旨在找出不再使用的頁面或最早未使用的頁面進行替換。
3. 死鎖現象及條件
死鎖是多線程競爭有限資源時的尷尬困境,當進程彼此持有資源並等待其他進程釋放,形成無盡循環,就陷入了死鎖。死鎖的四個必要條件:互斥、請求與保持、不剝奪和循環等待,是理解死鎖的關鍵。
4. 危險的緩沖區溢出
緩沖區溢出是編程中的安全隱患,當數據填充超出預設容量,覆蓋合法數據,可能導致程序崩潰或惡意代碼執行,源於對用戶輸入的疏忽檢查。
5. 非對稱與對稱加密演算法
非對稱加密利用公開和私有密鑰,加密解密使用不同密鑰,如RSA和AES,而對稱加密如DES,使用同一密鑰進行加密和解密,更便於效率提升。
6. 分段與分頁的對比
分頁為內存管理提供離散分配,消除零頭,提高利用率;分段則關注用戶需求,將完整意義的信息組合在一起。兩者各有其設計目的。
7. 上下文切換:多任務的幕後英雄
單核環境下,上下文切換是進程切換的機制,通過在進程間快速切換,讓看似並發運行。每個切換涉及保存當前狀態並載入新進程狀態。
8. 進程間通信的藝術
進程間通信的方式多種多樣,如管道(半雙工)、有名管道(無親緣性)、信號量(同步)、消息隊列(靈活)、信號(事件通知)、共享內存(高效)以及套接字(跨進程通信)。每種都有其獨特之處,滿足不同場景的需求。
9. 線程間的同步與通信手段
線程間的溝通主要為同步目的,如互斥鎖、條件變數、讀寫鎖等。互斥鎖保證數據一致性,讀寫鎖允許多線程讀,寫操作互斥,條件變數則在互斥鎖下實現阻塞和喚醒。
C. 阿裡面試官:恕我直言,搞懂這10道演算法題,輕松拿20K不是問題
01打怪獸
難度:容易
現在有3隻怪獸,他們的都有自己的血量a,b,c(1<=a,b,c<=100),當Tom打死第一怪獸的時候花費的代價為0,其餘的怪獸的代價為當前的怪獸的血量減去上一個怪獸的血量的絕對值。問Tom打死這些怪獸所需要的最小代價
02數組變換
難度:中等
給出一個長度為 n 的數組,和一個正整數 d。 你每次可以選擇其中任意一個元素 a[i] 將其變為 a[i] + d 或 a[i] - d,這算作一次操作。你需要將所有的元素全部變成相等元素,如果有解,請輸出最小操作次數,如果無解請輸出-1。
01超級區間
難度:中等
Tom現在有一個長度為n的數組,Jerry給Tom定義了一種超級區間,如果區間[l,r]滿足(a[l]+…+a[r])>=k,則區間[l,r]被稱為超級區間,現在Jerry想讓Tom告訴他數組中有多少個超級區間。
02能量半徑
難度:中等
codancer來到了一個能量平面上的中心,坐標為(0,0),接下來巫師Tom會在q個坐標上放置能量點,每個能量點的能量值為1,為了打敗哥斯拉,他需要至少k點的能量,因此他想確定一個最小的整數半徑r使得codancer能夠從這個圓心為(0,0),半徑為r的圓形區域內得到至少k個能量值,請你幫他確定最小的整數半徑r。
01找出二叉搜索樹的第2大的數
難度:容易
給定一個二叉搜索樹,找出其第二大的數。
02字元配對
難度:中等
給你一個字元串,字元串中僅包含"A","B",現在有四種字元串"AA","AB","BA","BB",每種字元串都有他們的權值,問從給出的字元串中能夠得到的最大權值為多少(一個字元只能屬於一個子字元串)?
01斐波那契字元串
難度:中等
Tom發現了一種神奇的字元串-斐波那契字元串,定義f[1]=0,f[2]=1,對於所有的i>2都有f[i]=f[i-2]+f[i-1],其中「+」代表拼接,比如01+10=0110,現在對於字元串f[n],請判斷f[n]的第k項是0,還是1?
01Hikari and Interstellar Experience
難度:容易
在無垠的宇宙中,有 n 個星球,第 i 個星球有權值vi 。由於星球之間距離極遠,因此想在有限的時間內在星際間旅行,就必須要在星球間建立傳送通道。 任意兩個星球之間均可以建立傳送通道,不過花費並不一樣。 第 i 個星球與第 j 個星球的之間建立傳送通道的花費是lowbit(vi ⊕ vj) ,其中⊕為二進制異或,而lowbit(x)為 x 二進制最低位的值,例如lowbit(5) = 1,lowbit(8) = 8 。 特殊地,lowbit(0) = 0。 Hikari 想在這 n 個星球間穿梭,於是――你需要告訴 Hikari,要使這 n 個星球相互可達,需要的花費最少是多少?
02二進制字元串
難度:中等
Tom得到了一個二進制字元串s,即s只由Ɔ'和Ƈ'組成,現在令d(t)代表二進制字元串t在十進制下的值。 那麼d(「011」)=3,d(「0001000」)=4,如果t的長度等於d(t),那麼就稱t是奇妙串,現在Tom想知道s中有多少個子串是奇妙串?
01小明的數學作業
難度:容易
眾所周知,小明是一個數學小能手,有一天數學老師給了小明一個長度為n(2<=n<=5000)的序列,其中第i個數是ai(0<=ai<=1e9),數學老師想知道這個序列排序後,其中最長的等差子序列的長度是多長,聰明的你能幫小明解決這個問題嗎?
02Codancer上樓
codancer來到了一棟大樓前,現在他要上樓。
如果codancer從第x層走樓梯到第y層(y>x),那麼他所花費的時間是a[x]+a[x+1]+…+a[y];
如果他從x層坐電梯到第y層,那麼他所花費的時間是c+(b[x]+b[x+1]+…+b[y]),因為他等電梯的時間為c。
現在codancer想知道從第1層到第n層需要最少需要多長時間?
01變換的秘鑰
難度:中等
Tom最開始有一個密鑰s1,s1是長度為n的由小寫字母組成的字元串。Jerry也有一個長度為n的由小寫字母組成的密鑰s2。現在有m組關系,每組關系由兩個數字[u,v]構成(1<=u,v<=26),表示26個字母表中的第u個小寫字母可以直接轉換為第v個小寫字母。假設u=1,v=2,那麼說明字母'a'可以直接轉換為字母'b'。現在Tom對於s1的每個字母使用無數次轉換,請判斷s1能否轉換為s2?
01最大邊權和
難度:簡單
現在有n個點(1<=n<=1000),每個點都有一個值稱為點權ai(ai為偶數,1<=ai<=1000),現在可以將任意兩個點相連,連起來以後這條邊也有一個值稱為邊權,這個邊的邊權為這兩個點的點權之和的一半。現在需要你添加n-1條邊,問將這n個點連通以後(連通是指任意兩個點都能互相到達)的最大的邊權和是多少?
02錢庄
難度:中等
錢庄每天能夠收到很多散錢,第i個散錢的值2 wi。為了便於管理,錢庄每天都會向中央銀行申請兌換錢幣,假設錢庄有一些散錢使得2 k1+2 k2+...+2 km=2^x(x為非負整數),那麼就可以將這些散錢兌換成一個大錢幣,問在錢庄收到的這些散錢最終最少能變成幾個錢幣?
01codancer的旅行
難度:困難
期末考試終於結束啦,Codancer開始了他的旅行,現在整個地圖上有n個城市,這些城市之間有n-1條道路相連,每條道路都有一個距離,並且保證整個圖是連通的,即這個地圖可以看作是一棵樹,現在假設Codancer要從城市A到城市B,那麼他的路費就是從A-B的路徑上邊權最大的邊的權值wmaxx元。現在Codancer有k元,他想知道他能選擇那些(A,B)並且A<B使得codancer能夠到達?
HashMap是一個用於存儲Key-Value鍵值對的集合,每一個鍵值對也叫做Entry。這些個鍵值對(Entry)分散存儲在一個數組當中,這個數組就是HashMap的主幹。
01全奇數組
難度:中等
codancer現在有n個正整數a[1],a[2]…a[n],Tom告訴codancer他可以進行下列操作,選擇某個偶數x,把這n個數中全部等於x的數字除2,Tom想知道把這n個數字全部變成奇數最少需要幾次這樣的操作?
以上十道演算法題你都能搞定嘛?備戰大廠每日刷一道演算法題來提升自己,堅持堅持再堅持,必然會有收獲。為大家整理一份781頁的高分寶典,知識較為全面,可分享給想要學習提升自己的朋友。
領取方式:私信【面試寶典】或點擊右方鏈接: https://shimo.im/docs/QVy8HrQgPYkx9Ddg/ 即可免費領取,喜歡本文不妨關注+轉發支持一下~~
D. 面試會出哪些經典演算法題
如下:
1、排序演算法∶快速排序、歸並排序、計數排序
2、搜索演算法∶回溯、遞歸、剪枝技巧
3、圖論∶最短路、最小生成樹、網路流建模
4、動態規劃:背包問題、最長子序列、計數問題
5、基礎技巧:分治、倍增、二分、貪心
6、數組與鏈表:單/雙向鏈表、跳舞鏈
7、棧與隊列
8、樹與圖:最近公共祖先、並查集
9、哈希表
10、堆:大/小根堆、可並堆
11、字元串∶字典樹、後綴樹
演算法簡介:
演算法(Algorithm)是指解題方案的准確而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。
如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間復雜度與時間復雜度來衡量。
演算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。隨機化演算法在內的一些演算法,包含了一些隨機輸入。
形式化演算法的概念部分源自嘗試解決希爾伯特提出的判定問題,並在其後嘗試定義有效計算性或者有效方法中成形。
這些嘗試包括庫爾特·哥德爾、Jacques Herbrand和斯蒂芬·科爾·克萊尼分別於1930年、1934年和1935年提出的遞歸函數,阿隆佐·邱奇於1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾倫·圖靈1937年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化演算法的情況。