當前位置:首頁 » 操作系統 » 典型演算法題

典型演算法題

發布時間: 2023-05-13 14:13:01

『壹』 面試最常考的 100 道演算法題分類整理

大家好,我是 「負雪明燭」 ,一位用 7 年寫了 1000 篇 LeetCode 演算法題題解的程序員。歡迎關注。

粉絲常說: LeetCode 演算法題太多了,准備面試該刷哪些題目

我之前根據 LeetCode 上面的點贊量分享過: LeetCode 上最經典的 100 道演算法題 。

這 100 道題目都屬於經典題目了,面試也常考,不過我還是不放心呢,畢竟 經典題 ≠ 面試題 呀!

但如果想知道面試常考的 100 道演算法題的話,需要至少整理 1000 篇面經吧?這個工作量可不小啊!

還好,網上有個開源項目,幫我們做了這件事情,這個項目就是 CodeTop

這是網站的界面(地址: https://codetop.cc/home ),展示的就是每個面試題目出現的頻度情況,甚至區分了公司和崗位:

這是開源項目的 GitHub 主頁,已經 11.5k star ⭐️ 了:

這個項目中的題目來源是牛客網的面經、網友投票等,而且持續更新中,所以還是比較可靠的。

我對這個項目做了整理,分類整理出來面試常考的 100 道演算法題。

在整理之後,我對結果還是有點 驚訝 的!因為一些常見的數據結構與演算法,竟然沒有在常考面試中出現過!

比如前綴和、前綴樹、並查集、圖,這些都沒有出現……

最常考面試題還是很基本的鏈表、二叉樹、動態規劃等等,是不是符合你的認知呢?

強烈建議大家在面試前把這 100 道題目搞懂!

作為寵粉達人,我提供了 3 種方式查看這 100 道題目:

沒有任何套路,直接分享給大家!

在線查看地址: https://www.mubucm.com/doc/7jiBYKCKqet

在線查看地址: https://leetcode-cn.com/problem-list/q3iOID0B/

所有題目的地址如下:

前序遍歷

中序遍歷

層序遍歷

視圖

如果你覺得對你有幫助的話,求贊、求分享、求收藏。你的每一點鼓勵都是對我的最大幫助!

『貳』 java經典演算法題——猴子吃桃

public class Monkey
{
public static void main(String[] args)
{
int sum=0,remain=1;
//每天吃剩的桃子加一個正好是前一天桃子的一半,每天桃子的總數就是前一天剩下桃子的數量
for(int day=9;day>=1;day--)
{
sum=(remain+1)*2;
remain=sum;
System.out.println("第"+day+"天還剩"+remain+"個桃子");
}
System.out.println(sum);
}
}

『叄』 面試會出哪些經典演算法題

1、排序演算法∶快速排序、歸並排序、計數排序

2、搜索演算法∶回溯、遞歸、剪枝技巧

3、圖論∶最短路、最小生成樹、網路流建模

4、動態規劃:背包問題、最長子序列、計數問題

5、基礎技巧:分治、倍增、二分、貪心

6、數組與鏈表:單/雙向鏈表、跳舞鏈

7、棧與隊列

8、樹與圖:最近公共祖先、並查集

9、哈希表

10、堆:大/小根堆、可並堆

11、字元串∶字典樹、後綴樹

(3)典型演算法題擴展閱讀:

演算法的重要性:

1、演算法能力能夠准確辨別一個程序員的技術功底是否扎實;

2、演算法能力是發掘程序員的學習能力與成長潛力的關鍵手段;

3、演算法能力能夠協助判斷程序員在面對新問題時,分析並解決問題的能力;

4、演算法能力是設計一個高性能系統、性能優化的必備基礎。

『肆』 面試會出哪些經典演算法題

如下:

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年提出的圖靈機。即使在當前,依然常有直覺想法難以定義為形式化演算法的情況。

『伍』 經典演算法題之兔子問題

就是那個遞歸演算法:f(1)=1;f(2)=1;f(3)=2;...f(n)=f(n-1)+f(n-2);程序是:(計算任一月兔子數)long fun(int x){ int i; if(x==1 || x==2) return 1; else return fun(x-1)+fun(x-2);}void main(){ int i,a; long s; scanf("%d",&a); printf("%ld\n",fun(a)); }

『陸』 經典C語言面試演算法題

經典C語言面試演算法題

1.寫一個函數,它的原形是int continumax(char *outputstr,char *intputstr)

功能:

在字元串中找出連續最長的數字串,並把這個串的長度返回,並把這個最長數字串付給其中一個函數參數outputstr所指內存。例如:"abcd12345ed125ss123456789"的首地址傳給intputstr後,函數將返回

9,outputstr所指的值為123456789。

#include

#include

#include

int FindMax_NumStr(char *outputstr,char *inputstr)

{

char *in = inputstr,*out = outputstr,*temp;

char *final;

int count = 0;

int maxlen = 0;

int i;

while(*in!='')

{

if(*in > 47 && *in < 58)

{

for(temp = in;*in> 47 && *in <58;in++)

count++;

}

else

in++;

if(maxlen < count)

{

maxlen = count;

count = 0;

final = temp;

}

}

for(i =0;i

{

*out = *final;

out++;

final++;

}

*out = '';

return maxlen;

}

void main(void)

{

char input[]="abc123def123456eec123456789dd";

char output[50] = {0};

int maxlen;

maxlen = FindMax_NumStr(output,input);

printf("the str %s ",output);

printf("the maxlen is %d ",maxlen);

}

2.求1000!的未尾有幾個0;

求出1->1000里,能被5整除的數的個數n1,能被25整除的數的個數n2,能被125整除的'數的個數n3,能被625整除的數的個數n4.1000!末尾的零的個數=n1+n2+n3+n4;

只要是末尾是5的數它乘以一個偶數就會出現一個0,而末尾是0的數乘以任何數也都會出現0

而末尾是0的如果是一個0肯定能被5整除,兩個0肯定能被25整數,以此類推3個0就能被5的三次方整除,也就是125

1000!就是1-1000數的相乘,能被5整除的所有數分別乘以一個偶數就會出現這些個的0,而例如100,既能被5整除,也能被25整除,所以就是兩個0

1000,既能被5,25,也能被125整除,所以算三個0

例如是10!=1*2*3*4*5*6*7*8*9*10,裡面有兩個數能被5整除,就是10和5,而

5隨便乘以一個偶數就出現一個0,而10乘以其它數也會出現一個0,所以10!會有兩個0

#include

#define NUM 1000

int find5(int num)

{

int ret = 0;

while(num%5==0)

{

num/=5;

ret++;

}

return ret;

}

int main(void)

{

int result = 0;

int i;

for(i=5;i<=NUM;i+=5)

result +=find5(i);

printf("the total zero number is %d ",result);

return 0;

}

3。編寫一個 C 函數,該函數在一個字元串中找到可能的最長的子字元串,且該字元串是由同一字元組成的。

char * search(char *cpSource, char ch)

{

char *cpTemp=NULL, *cpDest=NULL;

int iTemp, iCount=0;

while(*cpSource)

{

if(*cpSource == ch)

{

iTemp = 0;

cpTemp = cpSource;

while(*cpSource == ch)

++iTemp, ++cpSource;

if(iTemp > iCount)

iCount = iTemp, cpDest = cpTemp;

if(!*cpSource)

break;

}

++cpSource;

}

return cpDest;

}

;

『柒』 大公司筆試面試有哪些經典演算法題目

1、二維數組中的查找

具體例題:如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列?



『捌』 大公司筆試面試有哪些經典演算法題目

1、二維數組中的查找

具體例題:如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列?



『玖』 經典演算法題:分發糖果

n 個孩子站成一排。給你一個整數數組 ratings 表示每個孩子的評虧跡分銷蘆並。

你需要按照以下要求,給這些孩子分發糖果:

每個孩子至少分配到 1 個糖果。
相鄰兩個孩嘩物子評分更高的孩子會獲得更多的糖果。
請你給每個孩子分發糖果,計算並返回需要准備的 最少糖果數目 。

示例 1:

輸入:ratings = [1,0,2]
輸出:5
解釋:你可以分別給第一個、第二個、第三個孩子分發 2、1、2 顆糖果。
示例 2:

輸入:ratings = [1,2,2]
輸出:4
解釋:你可以分別給第一個、第二個、第三個孩子分發 1、2、1 顆糖果。
第三個孩子只得到 1 顆糖果,這滿足題面中的兩個條件。

提示:

n == ratings.length
1 <= n <= 2 * 104
0 <= ratings[i] <= 2 * 104

『拾』 演算法題(三)

(1)定義兩個變數,行變數row和列變數col

(2)利用while和if條件判。若是當前數小於target,row++;若是當前數大於target,col--。

(3)若搜索到相等,直接返回true

(4)若退出while後仍然沒有返回,則返回false

注意:利用while,不用兩層for,可以避免了整個二維數組的遍歷

思路:利用一個新凳緩的StringBuffer。遍歷原StringBuffer,若不為空格,直接加入新buffer尾部,否則append("%20")

思路:一個棧用來添加元素,一個棧用來彈出元素。重點是:在添加或彈出元素前,必須先彈出另一個棧的所有元素到當前棧。

思路:二分法。

    我們的目的是:當進行一次比較時,一定能夠確定答案在mid的某一側。一次答茄比較為 arr[mid]跟誰比的問題。

    一般的比較原則有:

        · 如果有目標值target,那麼直接讓arr[mid] 和 target 比較即可。

        · 如果沒有目標值,一般可以考慮  端點

    這里我們把target 看作是 右端點 ,來進行分析,那就要分析以下三種情況,看是否可以達到上述的目標。

· 情況1,arr[mid] > target:4 5 6 1 2 3

    arr[mid] 為 6, target為右端點 3, arr[mid] > target, 說明[first ... mid] 都是 >= target 的,因為原始數組是非遞減,所以可以確定答案為 [mid+1...last]區間,所以 first = mid + 1

· 情況2,arr[mid] < target:5 6 1 2 3 4

    arr[mid] 為 1, target為右端點 4, arr[mid] < target, 說明答案肯定不在[mid+1...last],但是arr[mid] 有可能是答案,所以答案在[first, mid]區間,所棗舉模以last = mid;

· 情況3,arr[mid] == target:

    如果是 1 0 1 1 1, arr[mid] = target = 1, 顯然答案在左邊

    如果是 1 1 1 0 1, arr[mid] = target = 1, 顯然答案在右邊

    所以這種情況,不能確定答案在左邊還是右邊,那麼就讓last = last - 1;慢慢縮少區間,同時也不會錯過答案。

思路:典型的遞歸。此外還可以用動態規劃等。

思路:遞歸。

思路:從數學公式中看出的遞歸方法。

思路:遞歸,或記憶性遞歸。

思路:利用位運算,直接找到從右向左第一個1的位置

思路:利用兩個隊列,第一次遍歷數組時,將奇數和偶數分別放入對應隊列;第二次遍歷兩個隊列,將元素放回數組

思路:按層列印,每個層用左上角和右下角兩個點選中。

思路:兩個棧,min棧每次保存當前棧元素的最小值

思路:定義一個棧,遍歷數組A,對於每個元素,先壓入棧,再循環彈出當前棧頂與數組B當前下標相同的元素。演算法結束,若棧為空,則返回true。

思路:回溯

思路一:遍歷數組,利用哈希表記錄元素個數;再遍歷哈希表,判斷哪個元素個數超過一半

思路二:利用題目信息,直接排序數組,返回最中間元素即可。

思路:先排序,再取前k個數

思路一:動態規劃

思路二:利用全局變數保存最大值,最大值為負數,直接置0,遍歷數組往後加

思路:貪心演算法。

(1)將原數組轉為字元串存在list中

(2)自定義Comparator對List進行排序

(3)逐位比較兩個字元串,若到達字元串尾部,返回首部繼續比較。

(4)利用StringBuffer將List進項拼接,並返回結果。

思路:丑數能夠分解成2^x 3^y 5^z,所以只需要把得到的丑數不斷地乘以2、3、5之後並放入他們應該放置的位置即可。

(1)定義三個指針,分別代表2,3,5的個數

(2)每次取運算結果的最小值

(1)定義一個包含所有字元的數組,ASCII碼(一個ASCII碼長度是一個位元組,也就是8個bit,最高位是0作為校驗位,其餘7位使用0和1進行組合,所以ASCII碼共有128個)

(2)遍歷字元,將每個字元作為下標,將數組對應下標值加1

(3)遍歷字元串,找到第一個數組值為1 的下標返回

思路:利用歸並排序的過程求解

思路:先利用二分查找找到該數的位置,再從該位置左右遍歷相同的數並計數。

思路:哈希表或異或運算

思路:窮舉法,雙層遍歷,找到了就加入結果集。

思路:雙指針法

(1)初始化雙指針為一頭一尾

(2)若當前兩數和小於S,則左指針右移;若大於S,則右指針左移;否則,輸出結果。

思路一:利用標准庫,s.substring()先進行字元串拆分,再進行拼接。

思路二:先轉為字元數組,再藉助輔助數組進行移位。

思路:先利用str.split(" ")將字元串按照空格分割為字元串數組,再利用數組移位或者是棧進行翻轉。

思路:

(1)先排序數組

(2)遍歷數組,記錄數組中0的個數和不同非0數字之間的差值

(3)根據0的個數和差值進行判斷

思路:遞歸,當我們知道了 f(n - 1, m) 對應的答案 x 之後,我們也就可以知道,長度為 n 的序列最後一個刪除的元素,應當是從 m % n 開始數的第 x 個元素。

思路:遞歸

思路:注意越界問題即可。用布爾值記錄正負號,再逐位計算。

思路:利用set進行遍歷即可

思路一:利用一個棧,將元素順序倒置。

思路二:正序遍歷並保存元素至鏈表,利用Collections.reverse(list)反轉鏈表。

思路:快慢指針,首先讓快指針先行k步,然後讓快慢指針每次同行一步,直到快指針指向空節點,慢指針就是倒數第K個節點。

思路:歸並排序

思路:利用Map集合存儲<鏈表節點,新建節點>,再遍歷鏈表,建立新建鏈表之間的關系。

思路:這道題默認無環

(1)都無環:得到兩個鏈表的長度,長鏈先走,再和短鏈一起走

(2)都有環:

        · 若入環點相同,同無環解法

        · 若入環點不同,從一個入環點往下遍歷,在碰到自己之前碰到了另一個入環點,則返回該入環點;否則無相交點

其他情況都無相交點。

思路:遞歸。利用中序和前序中,根節點的位置進行劃分左右子樹。

思路:遞歸,選中結點遞歸是否是子樹,若不是子樹,再遞歸選中結點的左右節點查找子樹。

思路:遞歸,DFS,先交換左右節點,再繼續遞歸左右子節點

思路:利用隊列,層序遍歷,BFS。

思路:遞歸,根據元素大小進行左右遞歸分區,知道分區只剩一個元素或0個元素,往前返回。

思路:回溯,每個元素先加入,若滿足條件,加入結果集,再遍歷左右子樹,然後回溯。

思路:先中序遍歷結果存儲在鏈表中,再遍歷鏈表,連接左右指針。

思路:遞歸,遞歸過程中將左右子樹的最大值加1;

思路:遞歸,遞歸中判斷左右字數高度差

注意substring中沒有單詞大寫!

    是String類中的方法

熱點內容
三國志戰略版打9級礦什麼配置 發布:2025-05-15 11:41:29 瀏覽:951
安卓加速器怎麼關 發布:2025-05-15 11:38:16 瀏覽:464
密碼鎖壞了如何打開 發布:2025-05-15 11:30:19 瀏覽:837
怎樣增加共享文件夾連接數量 發布:2025-05-15 11:24:50 瀏覽:961
安卓如何關閉單應用音量 發布:2025-05-15 11:22:31 瀏覽:351
抖音電腦後台伺服器中斷 發布:2025-05-15 11:11:59 瀏覽:307
sql2008伺服器 發布:2025-05-15 11:03:27 瀏覽:306
我的世界pe伺服器創造 發布:2025-05-15 10:51:17 瀏覽:608
移動端打吃雞要什麼配置 發布:2025-05-15 10:48:16 瀏覽:756
我的世界哪五個伺服器被炸了 發布:2025-05-15 10:36:16 瀏覽:994