導航:首頁 > 源碼編譯 > 程序員面試需要演算法嗎

程序員面試需要演算法嗎

發布時間:2023-08-23 03:29:00

1. 大家覺得演算法程序員有多重要,需要花很多

「演算法,先於計算機存在於世,比編程語言本身更為重要。語言只是工具,演算法才是靈魂。」而程序就等於演算法加數據結構,足以可見,想要在編程之路上走得更長遠,數據結構與演算法是必須掌握的基本功。

想跟上時代發展嗎?那你無法跳過數據結構與演算法!

在計算機編程領域,數據結構與演算法的應用無處不在,比如圖像視頻處理、數據壓縮、資料庫、游戲開發、操作系統、編譯器、搜索引擎、AR、VR、人工智慧、區塊鏈等領域,都是以數據結構與演算法為基石。只要你想做這一行,就必然要掌握數據結構與演算法。

想通關大廠面試嗎?別讓數據結構與演算法拖你後腿!

演算法是各大名企面試題中的常客,越是厲害的公司,越是注重考查數據結構與演算法。但很可惜,很多人雖然技術不錯,但經常都會敗在演算法上。

不願意一輩子做CRUD boy?數據結構與演算法幫你敲開高級編程領域的大門!

數據結構與演算法屬於開發人員的基本內功,也能訓練大腦的思考能力,掌握一次,終生受益。扎實的數據結構與演算法功底,能讓開發者站在更高的角度去思考代碼、寫出性能更優的程序,能夠更快速地上手各種新技術。

2. 為什麼程序員普遍缺乏數據結構和演算法的知識

語言只是工具,而演算法才是程序的靈魂。這句話,我估計你在編程之路上,已經聽到過無數次。但具體到工作里,你是不是還會有下面這樣的困惑?數據結構和演算法,跟操作系統、計算機網路一樣,是脫離實際工作的知識。除了面試,我可能這輩子也用不著。就算不懂這塊知識,只要 java API、開發框架用得熟練,我照樣可以把代碼寫得「飛」起來。那今天我就來詳細聊一聊,為什麼要學習數據結構和演算法。

如果你理解他們背後對應的數據結構,那就可以迅速看到這些類背後的本質區別,那個時候,你根本不用死記硬背,自然理解什麼樣的場景里該選擇什麼。在西安交大讀研究生的時候,一個師兄給了我一本《演算法導論》,從此我便一頭扎進演算法世界,到現在也十多年了。這期間,我研究過數十本數據結構與演算法的書籍,並對它們進行了仔細地對比、分析。

3. 演算法不扎實的程序員,每一個都很慌

初學者經常問這樣的問題,然而這些其實是錯誤的問題。

對於初學者而言,你最應該優先考慮的是,哪些東西構成了程序的基礎?

最經典的一句話: 程序 = 數據結構 + 演算法

如果說編程語言是程序的血肉,那麼演算法就是程序的靈魂。

人不能沒有血肉之軀,但是沒有靈魂的人依然只是一個死人。

不能單純依靠演算法衡量一個程序員的好壞,但是面試的時候考演算法絕對是簡單高效的篩選手段。近些年大廠的面試幾乎必考演算法也是這個原因。每一個演算法學的不扎實的程序員,在面試的時候都很慌。

下面這些書籍應該是演算法方面最常見的經典書籍。我有幸都讀過,有些讀完了,有些半途而廢,不過基本上也都算是熟悉。順序上由易到難,從薄到厚,每本書下面我會簡單的介紹一番,希望能對你的學習有所幫助。

首先是兩本演算法入門書籍,也可以當做演算法讀物:

《啊哈!演算法》

用他的自我介紹的來講:「這不過是一本有趣的演算法書而已,和別的演算法書比較,如果硬要說它有什麼特點的話,那就是你能看懂它。」

圖文並茂,而且畫風有趣,適合新手入門,但是代碼是C的,看著比較累,文字也略顯冗長。

圖是非常棒的,啟蒙用,非教科書

《演算法圖解》

和《啊哈》類似,他的介紹是:「像小說一樣有趣的演算法入門書。」

書裡面講的很好,python代碼也很容易讀懂,比之《啊哈!演算法》,書中的例子沒有那麼有趣,但是圖很清晰,文字和代碼不冗雜。

缺點同樣是非教科書,非常淺顯,三四個小時就看完了。有一種剛剛熱身的感覺。

接下來這幾本都是最常見的書了:

《數據結構與演算法分析C語言描述》

這本書的作者幾乎不浪費筆墨在一些簡單的地方。書很薄,但是覆蓋面很廣很深,作者實在是非常厲害。

不過反過來說,就是有些地方講的語焉不詳……

這本書還有Java語言版本的,但是相比之下C的更好一些。

挺好的一本書。

還有一點是翻譯不是很給力,好多人都沒堅持看完。

《數據結構與演算法Python語言實現》

英文版評分非常高,中文版評分非常低……

據說是也翻譯的不好。另外就是本書自身錯誤也不少……幾版過後依然很多沒有改過來。

書中數學證明和介紹比較簡單。因為採用Python語言的原因,比較易讀。

淺顯易懂,內容上循序漸進,環環相扣。相比於上一本,我會更推薦一些。厚度也不算厚。

《數據結構與演算法 Python語言描述》

北大教授裘宗燕的書,這本書前面寫的挺好的,尤其是在面向對象還有ADT等思想的闡述,都很不錯。

但是讀到後來給我一種虎頭蛇尾的感覺,前面氣勢如虹緒論就寫了很長,最後三章感覺有點草草收尾的意思。就像編輯在催稿,而作者很忙的樣子……

另外就是這本書的編排順序我個人也不是特別喜歡。

接下來是兩本大部頭,都是非常厚的書。

他們最大的特點就是:出現率遠大於看完率

《演算法導論》

演算法書中的權威,MIT的6.046J就是按照這個來講的。

公認最好的演算法書,組織結構合理,內容詳盡。引導讀者從思維方式上對演算法進行領悟。

書中對演算法的數學結構進行了詳盡的闡述。有非常多的數學證明。

這本書我說不出什麼缺點,只能說有些內容是因為我還沒到大牛的境界,暫時還無法體會理解。

我個人的觀點是:不要糾結於詳細的偽代碼,不用糾結於連篇累牘的講解。體會其中演算法的精髓就好。

《演算法》第四版

如果說,《演算法導論》是學術上最好書,那這本應該是實際應用最好的書。

它對數學的要求比《演算法導論》低很多,摒棄了演算法的證明。

書中具體給出了每位程序員應知應會的50個演算法,深入淺出,大量圖解。非常棒。

java基礎的話你能擼出來Hello World基本上就可以開始看這本書了,這本書最大的不友好之處在於它的第一章非常長,沒看過的人又不知道哪裡可以跳過。

這本書後面的翻譯感覺不如前邊了,不知道是換人了還是DDL了……

翻開書就會看到很多的圖,配套作者在coursera上面的課程學的話事半功倍!

接下來的幾本我看的比較少,簡單介紹一下,希望大家自己去發現和了解,不要漏下這些好書:

《編程珠璣》

很薄一本啊,但是我放在那還沒看完……

這本書被稱為: 歷史 上最偉大的計算機科學著作之一

融深邃思想、實戰技術與趣味軼事於一爐的奇書。

內容不深,但是不是一個知識點一個知識點的給你講解演算法原理的。

這本書的核心思想是讓你了解如何正確選擇和高效地實現演算法。書中還有一些趣聞軼事,看著倒是很有意思~

有興趣的同學可以看看~

《演算法競賽入門經典》系列

演算法競賽入門經典書,ACM必備書籍吧算是。書中題目對於競賽來說比較簡單,但是對於一般我們平時工程來說偏難。語言用的是C/C++,請好好做例題好好做作業,讀書的時候好好思考和復習~

反正我是沒讀過,捂臉……

《劍指Offer》

這個書很有意思,對於在校生來說我個人覺得是必看的書。沒有任何工作經驗的同學在面試的時候真的會被問懵的。這本書可以讓你了解如何應付考官日常問題,在解答面試問題的時候,書中很多方法和思路會讓考官覺得你思考的很全面,給你加不少分。

我面試的時候也曾快速掃過一遍這本書,讓我在回答問題的時候條理更清晰。書中代碼是C的,emmm,於是代碼部分我就沒太看……

《用Python解決數據結構與演算法問題》

最後給大家推薦一本在線的 免費 的演算法書。

https://facert.gitbooks.io/python-data-structure-cn/

不是大部頭,也不是讀物,新手入門足夠用,書中介紹了大多數日常需要的演算法,並且講的比較淺顯~轉行的新手基本可以通過這本書來快速掌握常用基本演算法了~

反正免費,是否適合自己看兩頁也就get了~

如果需要PDF版,可以在「程序員必修課」公眾號後台回復:「Python演算法書」獲取。

4. 程序員應該怎樣去面試 程序員面試注意事項

程序員面試注意事項如下。

1、呈現出自己完整的知識結構。

對於程序員來說,最重要的一件事慧虧此情就是在短短的面試過程中呈現出自己完整的知識結構。要想做到這一點,一定要在自我介紹的過程中下足功夫,既簡練又豐富,引起面試官的重視。

2、重視項目經驗的介紹。

無論是應聘初級程序員還是主力程序員,項目經驗都是面試官最為關注的內容之一,也是面試者能力的衡量標准之一。在項目介紹的時候要選擇比較有代表性的項目,簡單的說就是規模越大越好,參與程度越深越好。能夠清晰的描述自己在項目中的工作職責和最終的完成情況。

3、重視解決問題的能力。

通過一個具體的難點問題如何解決來呈現自己解決問題的能力,這種做法更有說服力,而且盡量突出重點內容,比如演算法設計、實現過程、驗證過程等內容,解決問題的能力是主力程序員的核心競爭力之一。

4、突出自己的學習能力。

程序員在整個職業生涯中需要不斷的學習,因為整個IT領域的技術更新速前迅度是比較快的,面試官往往對程序員的學習能力比較關注,可以通過不同的項目採用不同的技術方案來體現自己較強的學習能力。

5、體現出自己的交流能力。

交流能力對於程序員來說也是非常重要的,項目開發過程中需要頻繁的交流,所以交流能力也是面試官比較關注的方面之一。體現交流能力的關鍵是把握空耐住交流的主線,所有的思路要緊緊圍繞核心問題,盡量不要做過多的擴展,這樣容易顧此失彼。

6、描述自己的職業規劃。

一個好的職業規劃會給面試官留下一個好印象,也會為自己爭取到更好的職位奠定一個基礎。

5. 程序員一定要演算法能力強嗎

演算法能力強對於低級點的程序員不是必須但是成為高級的程序員就是必須的了,演算法學的好的話,不論對你思考問題的方式還是對你編程的思維都會有很大的好處。演算法的學習不只是理論的支持,更需要你不斷的在理論的基礎上去code,去思考。

6. 嵌入式工程師面試中常出現的演算法

嵌入式工程師面試中常出現的演算法

嵌入式系統是以應用為中心,以計算機技術為基礎,並且軟硬體可裁剪,適用於應用系統對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統。下面我為大家整理了關於嵌入式工程師面試中經常出現的演算法文章,希望對你有所幫助。

二分查找的代碼.

int bfind(int* a,int len,int val)

{

int m = len/2;

int l = 0;

int r = len;

while(l!=m && r!= m)

{

if(a[m] > val)

{

r = m;

m = (m+l)/2;

}

else if(a[m] < val)

{

l = m;

m = (m+r)/2;

}

else

return m;

}

return -1; //沒有找到

}

寫出在母串中查找子串出現次數的代碼.

int count1(char* str,char* s)

{

char* s1;

char* s2;

int count = 0;

while(*str!='')

{

s1 = str;

s2 = s;

while(*s2 == *s1&&(*s2!='')&&(*s1!='0'))

{

s2++;

s1++;

}

if(*s2 == '')

count++;

str++;

}

return count;

}

查找第一個匹配子串位置,如果返回的是s1長度len1表示沒有找到

size_t find(char* s1,char* s2)

{

size_t i=0;

size_t len1 = strlen(s1)

size_t len2 = strlen(s2);

if(len1-len2<0) return len1;

for(;i {

size_t m = i;

for(size_t j=0;j {

if(s1[m]!=s2[j])

break;

m++;

}

if(j==len)

break;

}

return i }

寫出快速排序或者某種排序演算法代碼

快速排序:

int partition(int* a,int l,int r)

{

int i=l-1,j=r,v=a[r];

while(1)

{

while(a[++i] while(a[--j]>v) if(j<=i) break;

if(i>=j)

break;

swap(a[i],a[j]);

}

swap(a[i],a[r]);

return i;

}

void qsort(int* a,int l,int r)

{

if(l>=r) return;

int i = partition(a,l,r);

qsort(a,l,i-1);

qsort(a,i+1,r);

}

冒泡排序:

void buble(int *a,int n)

{

for(int i=0;i {

for(int j=1;j {

if(a[j] {

int temp=a[j];

a[j] = a[j-1];

a[j-1] = temp;

}

}

}

}

插入排序:

void insertsort(int* a,int n)

{

int key;

for(int j=1;j {

key = a[j];

for(int i=j-1;i>=0&&a[i]>key;i--)

{

a[i+1] = a[i];

}

a[i+1] = key;

}

}

出現次數相當頻繁

實現strcmp函數

int strcmp11(char* l,char* r)

{

assert(l!=0&&r!=0);

while(*l == *r &&*l != '') l++,r++;

if(*l > *r)

return 1;

else if(*l == *r)

return 0;

return -1;

}

實現字元串翻轉

void reserve(char* str)

{

assert(str != NULL);

char * p1 = str;

char * p2 = str-1;

while(*++p2); //一般要求不能使用strlen

p2 -= 1;

while(p1 {

char c = *p1;

*p1++ = *p2;

*p2-- = c;

}

}

將一個單鏈表逆序

struct list_node

{

list_node(int a,list_node* b):data(a),next(b) //這個為了測試方便

{}

int data;

list_node* next;

};

void reserve(list_node* phead)

{

list_node* p = phead->next;

if(p == NULL || p->next == NULL) return; //只有頭節點或一個節點

list_node* p1=p->next;

p->next=NULL;

while(p1!=NULL)

{

p = p1->next;

p1->next = phead->next;

phead->next = p1;

p1 = p;

}

}

測試程序:

list lt;

lt.phead = new list_node(0,0);

lt.phead->next = new list_node(1,0);

lt.phead->next->next = new list_node(2,0);

lt.phead->next->next->next = new list_node(3,0);

lt.reserve();

list_node * p = lt.phead;

while(p)

{

coutnext;

}

循環鏈表的節點對換和刪除。

//雙向循環

list_node* earse(list_node* node)

{

// if(node == rear) return node->next; //對於頭節點可判斷也可不判斷。最好加上

list_node* next = node->next;

next->prev = node->prev;

node->prev->next = next;

delete node;

retrun next;

}

//單項循環

list_node* earse(list_node* node)

{

// if(node == rear) return node->next; //對於頭節點可判斷也可不判斷。最好加上

list_node* p = rear;

while(p->next != node) p=p->next;

p->next = node->next;

delete node;

retrun p->next;

}

將一個數字字元串轉換為數字."1234" -->1234

int atoii(char* s)

{

assert(s!=NULL);

int num = 0;

int temp;

while(*s>'0' && *s<'9')

{

num *= 10;

num += *s-'0';

s++;

}

return num;

}

出現次數相當頻繁

.實現任意長度的整數相加或者相乘功能。

void bigadd(char* num,char* str,int len)

{

for(int i=len;i>0;i--)

{

num[i] += str[i];

int j = i;

while(num[j]>=10)

{

num[j--] -= 10;

num[j] += 1;

}

}

}

.寫函數完成內存的拷貝

void* memcpy( void *dst, const void *src, unsigned int len )

{

register char *d;

register char *s;

if (len == 0)

return dst;

if ( dst > src ) //考慮覆蓋情況

{

d = (char *)dst + len - 1;

s = (char *)src + len - 1;

while ( len >= 4 ) //循環展開,提高執行效率

{

*d-- = *s--;

*d-- = *s--;

*d-- = *s--;

*d-- = *s--;

len -= 4;

}

while ( len-- )

{

*d-- = *s--;

}

}

else if ( dst < src )

{

d = (char *)dst;

s = (char *)src;

while ( len >= 4 )

{

*d++ = *s++;

*d++ = *s++;

*d++ = *s++;

*d++ = *s++;

len -= 4;

}

while ( len-- )

{

*d++ = *s++;

}

}

return dst;

}

出現次數相當頻繁

編寫類String的構造函數、析構函數和賦值函數,已知類String的原型為:

class String

{

public:

String(const char *str = NULL); // 普通構造函數

String(const String &other); // 拷貝構造函數

~ String(void); // 析構函數

String & operate =(const String &other); // 賦值函數

private:

char *m_data; // 用於保存字元串

};

解答:

//普通構造函數

String::String(const char *str)

{

if(str==NULL)

{

m_data = new char[1]; // 得分點:對空字元串自動申請存放結束標志''的`空

//加分點:對m_data加NULL 判斷

*m_data = '';

}

else

{

int length = strlen(str);

m_data = new char[length+1]; // 若能加 NULL 判斷則更好

strcpy(m_data, str);

}

}

// String的析構函數

String::~String(void)

{

delete [] m_data; // 或delete m_data;

}

//拷貝構造函數

String::String(const String &other) // 得分點:輸入參數為const型

{

int length = strlen(other.m_data);

m_data = new char[length+1]; //加分點:對m_data加NULL 判斷

strcpy(m_data, other.m_data);

}

//賦值函數

String & String::operate =(const String &other) // 得分點:輸入參數為const型

{

if(this == &other) //得分點:檢查自賦值

return *this;

delete [] m_data; //得分點:釋放原有的內存資源

int length = strlen( other.m_data );

m_data = new char[length+1]; //加分點:對m_data加NULL 判斷

strcpy( m_data, other.m_data );

return *this; //得分點:返回本對象的引用

}

剖析:

能夠准確無誤地編寫出String類的構造函數、拷貝構造函數、賦值函數和析構函數的面試者至少已經具備了C++基本功的60%以上!

在這個類中包括了指針類成員變數m_data,當類中包括指針類成員變數時,一定要重載其拷貝構造函數、賦值函數和析構函數,這既是對C++程序員的基本要求,也是《EffectiveC++》中特別強調的條款。

實現strcpy

char * strcpy( char *strDest, const char *strSrc )

{

assert( (strDest != NULL) && (strSrc != NULL) );

char *address = strDest;

while( (*strDest++ = * strSrc++) != ‘’ );

return address;

}

編寫一個函數,作用是把一個char組成的字元串循環右移n個。比如原來是“abcdefghi”如果n=2,移位後應該是“hiabcdefgh”

函數頭是這樣的:

//pStr是指向以''結尾的字元串的指針

//steps是要求移動的n

void LoopMove ( char * pStr, int steps )

{

//請填充...

}

解答:

正確解答1:

void LoopMove ( char *pStr, int steps )

{

int n = strlen( pStr ) - steps;

char tmp[MAX_LEN];

strcpy ( tmp, pStr + n );

strcpy ( tmp + steps, pStr);

*( tmp + strlen ( pStr ) ) = '';

strcpy( pStr, tmp );

}

正確解答2:

void LoopMove ( char *pStr, int steps )

{

int n = strlen( pStr ) - steps;

char tmp[MAX_LEN];

memcpy( tmp, pStr + n, steps );

memcpy(pStr + steps, pStr, n );

memcpy(pStr, tmp, steps );

}

;

7. 為什麼java面試演算法特別多

因為演算法是比較基礎又復雜的學科。
這就是沒理解這道題考察的意圖,不是考察你javaAPI的使用,而是看看你的思維和代碼編程能力。開發工程師的主要工作就是處理各種邏輯。比如給你一個真實的工作需求,讓你把一個數據作排序,但是相同的數只保留兩個,或者給一個字元串按第個字母進行排序。只會使用API或者粘貼復制是遠遠不夠的,而排序演算法是邏輯最直接的,最好表達,也是行數較少的思維考查,所以筆試面試里見面的次數就比較多。
Java是一門面向對象的編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特徵。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程。

閱讀全文

與程序員面試需要演算法嗎相關的資料

熱點內容
伺服器上如何查看伺服器的埠 瀏覽:676
單片機伺服器編譯 瀏覽:768
單口usb列印機伺服器是什麼 瀏覽:859
戰地五開伺服器要什麼條件 瀏覽:954
在word中壓縮圖片大小 瀏覽:253
javatomcat圖片 瀏覽:417
程序員生產智能創意 瀏覽:65
匯和銀行app怎麼登錄 瀏覽:381
騰訊伺服器如何上傳源碼 瀏覽:745
單片機的原理概述 瀏覽:510
火控pdf 瀏覽:267
如何復制雲伺服器centos環境 瀏覽:984
債權pdf 瀏覽:303
紅色番字的app怎麼下載 瀏覽:876
雲伺服器流程教課 瀏覽:702
中國農業銀行app怎麼沒有網 瀏覽:997
幾率表演算法 瀏覽:902
程序員理工科 瀏覽:708
企業郵箱登錄收件伺服器地址 瀏覽:560
計算機思維與演算法設計的重要性 瀏覽:664