演算法系列教程01 開篇

2021-09-07 21:41:19 字數 1822 閱讀 3901

為什麼要學習演算法呢?我個人覺得最終目的還是為了提高自己的職場競爭力。演算法的本質就是解決問題,所以學習演算法本質上是在提高解決問題的能力,這是職場最重要的能力之一。另外,如果你想在面試中表現得更加出色,也要對演算法有一定程度的掌握。

寫教程是很耗費精力的,而且學習演算法是很枯燥的,但如果大家都能參與進來一起交流討論,那麼整個過程就是不斷進行頭腦風暴、集思廣益的過程,這會是我繼續寫作的動力,這也會使得枯燥的演算法學習之路變得有趣,並讓每個人收穫滿滿。

為了更方便大家利用碎片化的時間學習,更好的利用空閒時間在手機上閱讀,這個系列的每一篇文章我都會精心排版,而且每一篇文章閱讀時間都不會太長,會盡量控制在 6 分種以內(不包括思考的時間)。

這個系列會包含三部分內容。第一部分是演算法基礎,由於演算法和資料結構是密切相關的,所以也會講到一些資料結構的知識,但不會講太細。第二部分以常見的演算法案例解析為主,包括解析一些演算法面試題。第三部分是演算法在機器學習中的應用,由於我自己也沒有學習過機器學習,所以這部分是探索式和交流式的,我會把我學到的用我理解寫出來,希望大家能參與進來一起交流。

希望這個演算法系列教程能幫助大家在今後的程式設計道路上得心應手。

好了,我們今天以乙個演算法問題 fizzbuzz 來開篇吧。fizzbuzz 是乙個非常典型的用來面試的演算法題。下面是 fizzbuzz 的自然語言描述:

編寫乙個程式,列印 1 到 100 中的數字,但能被 3 整除的變為「fizz」,能被 5 整除的變為「buzz」,既能被 3 整除又能被 5 整除的變為「fizzbuzz」。

一看是不是很簡單?確實很簡單。看完題,隨手就能寫出下面的**:

for (var i = 1; i < 101; i++)
和需求吻合,好像沒什麼問題。等等,仔細檢查,這段**問題大了,fizzbuzz永遠沒有輸出的機會,例如遇到 i=15 還是會輸出fizz。這是初級程式設計師很容易犯的乙個錯誤,拿到需求後直接就是一通寫,對需求的理解比較生硬,不容易考慮到上下文的關聯關係。糾正後的寫法是將第 4 行的 if 條件放到最前面:

for (var i = 1; i < 101; i++)
這樣寫是對的,但如果是面試,這個答案只能算是及格。如何能做到優秀呢?我總結寫演算法可以分為三個步驟:

第一步是實現,即按照需求把演算法寫對了,讓程式能正確的執行;第二步是優化,即降低複雜度,讓程式運算更高效。第三步是美化,即讓**看起來美觀簡潔,這一步很多時候會靈活運用到程式語言本身的語法糖,但簡潔有時候會犧牲**的易讀性,這需要在實際場景中稍作權衡。

做到這三步,我覺得應對面試中的演算法題就可以拿優秀了。

前面我們已經完成了寫 fizzbuzz 演算法的第一步,我們再來做第二步:優化。既能被 3 整除又能被 5 整除,我們很自然會想到 3 和 5 的最小公倍數:15,能被 15 整除的數一定也是既能被 3 整除又能被 5 整除的。也就是說上面的第二行**可以只對i判斷一次(而不是兩次),下面是優化後的**:

for (var i = 1; i < 101; i++)
我們再來看第三步:美化。上面我們寫這個演算法用了 6 行**(包括大括號),如果要減少**量,能減少到多少行呢?這裡給到 2 行的實現方案:

for (let i = 0; i < 100; )

console.log((++i % 3 ? '' : 'fizz') + (i % 5 ? '' : 'buzz') || i)

前端系列 01 開篇

最近工作中需要用到vue,於是就學習了一下前端相關的知識,由於我本人是從事測試相關崗位,主要也就寫寫能滿足測開需求的頁面,如admin之類的頁面,因此,涉及前端的知識也不會很全面,路線html css j ascript vue2.尚在學習和摸索階段,偏向個人筆記的風格吧,因每個人的計算機知識面不同...

資料結構 演算法系列一 開篇的話

每當要找工作的時候就覺的該複習下c語言和資料結構了,第一次是在畢業馬上要開始找工作時,第二次就是現在第一次準備換工作時。從畢業開始工作到現在 差乙個月就兩年了 每當回首往事時總是覺的進步的不夠快,不夠明顯,不能獨擋一面,而感覺懊惱,困惑。感覺自己也挺努力的,但是就是沒有成就感,原始的動力在一點點耗去...

java演算法系列

棧的概念 棧是一種特殊的線性表,堆疊的資料元素以及資料元素之間的關係和線性表是完全一樣的。差別是線性表是在任意位置進行插入和刪除操作,棧是只允許在固定的一端進行插入和刪除,棧的插入和刪除只允許在棧頂,棧的插入和刪除通常稱為進棧和出棧。資料集合 每個資料元素的資料型別可以是任意的型別 操作的集合 進棧...