對於不少碼農來講,算法老是顯得有那麼一點高深莫測,好像是一道難以跨越的坎。形成這種現象的緣由,一是由於咱們對算法的瞭解和對本身能力的瞭解不夠,還沒入門就被嚇退了,另一個緣由是,大部分人實際工做中不多用到算法,不少算法都已經被封裝到函數庫或接口裏面了,只須要調用就行,而爲了能早點完成任務,咱們通常都不會去想接口裏面的算法如何實現,只管調用來完成任務,順利交差就萬事大吉了。程序員
「無論用什麼方法,可以完成任務就能夠」,其實我以爲這種想法也是能夠的,畢竟咱們搞技術的都比較崇尚實用主義。可是若是咱們懂得背後的原理,可能內心會舒坦一些,並且在使用別人接口達不到理想的性能要求時,能夠分析是不是接口的實現有問題,從而懂得去選擇其餘實現版本或者本身動手寫,而本身動手寫,就必須懂算法了。此外,不少大公司在面試中,每每也會考你算法,不少不少人都倒在算法這個環節上,屍骨遍野。這就是做爲碼農,即便你的工做不是算法研究,也須要了解一些基礎算法的緣由。面試
基礎算法,我以爲對於大部分程序員來講,經過必定時間的練習,是能夠學會的。瞭解了這一點,咱們纔不至於很容易被算法嚇退。若是你是個算法小白,如今要開始學習算法了,但是又不知道從何學起,那麼我這裏給你一些建議。算法
首先,去找大學的數據結構和算法教程來看。我爲何不推薦不少人都知道的大部頭《算法導論》呢?我是怕這大部頭又把你嚇退了,因此仍是先從簡單一點的開始吧。數據結構和算法是分不開的,通常來講,每種算法都是爲某種數據結構服務的,不一樣的數據結構,每每須要使用不一樣的算法。數據結構,能夠理解爲,咱們存放一堆數據時,要以某種結構形式存放,而算法,就是要從這堆數據中尋找到你想要的那一小坨數據的方法,而衡量算法優劣的,是空間和時間複雜度,也就是若是你能使用更少的時間和更少的空間(好比計算時須要使用的內存)就能獲得答案,那麼這個算法就是更好的。數據結構
假設你已經學過教材了,練習過教材上的一些算法題目,那麼如今你能夠嘗試去刷刷LeetCode上的題目了。LeetCode上有不少算法題,按難度分爲初級、中級等,練習時能夠從簡單的到難一點的,這樣容易讓你練習的過程當中保持信心。不少公司在面試算法題時,也是直接使用LeetCode上的題目。我本人曾經在遠程面試一家不錯的外企時,被要求線上完成3道算法題,由於當時已經有比較長時間不接觸算法題目了,因此沒能很好完成,也錯失了一次機會。而後次日,我就去LeetCode上看題目,恰巧看到了這家外企出的算法題目,我再嘗試去解決,沒想到順利把這些題目完成了。若是我在刷這幾道題目以後接受那家外企的線上算法題筆試,也許Offer早就收入囊中了。如今,你應該知道,想要得到好的機會,爲何刷刷算法題可能也是必要的緣由了。數據結構和算法
除了LeetCode,還有一個我推薦你學習算法的網站,這個網站叫作:GeeksForGeeks,隨便搜下就找到了。這網站上面有很多巨頭公司的算法題目,包括微軟、谷歌、亞馬遜、Facebook等等,而且給出瞭解法,同時有很多面試者分享他們去這些公司面試後的面經,你能夠參考參考。我曾經在這個網站上呆蠻長一段時間,如今好久沒上去看了,寫這篇文章時,我再打開這個網站,已經很難打開了,貌似須要你會輕功才能順暢訪問,哎,我就不說得太直白了。函數
以上提到的那些學習資料或網站資源,在你學習時,可能也會以爲學是學了,惋惜缺少使用場景,仍是沒法感覺到這些算法的威力所在。如今也有一些付費的算法專欄,號稱根據使用場景帶你學習算法,讓你真正明白算法是如何在實際項目中使用的。由於我沒有訂閱這個專欄,目前也不想免費給他們作廣告,所以仍是先不提了,若是須要這種學習方式,能夠本身去搜索瞭解下這些專欄,或者私信我,我會告訴你去哪裏訂閱。性能
做爲程序員,若是你還有蠻多閒暇時間,除了打遊戲不知道幹嗎的,建議這樣去學學算法吧。不過提醒一下,我這些建議主要是給沒有算法基礎或者算法基礎薄弱的技術人,高手路過期,還望理解,如能笑納,本人將倍感榮幸!學習
原文地址:閒着沒事?你能夠這樣學學算法網站