從JavaScript到C Plus Plus
作為一個忠誠的Web開發者,JavaScript幾乎是我這一年多以來的首選,不管是開發網站後端服務,還是開發跨端應用,我都會首選一個使用JavaScript作為主語言的框架,例如Electron,React-Native等等,毫無疑問,JavaScript開發上更加貼近業務邏輯,抽象層次也比相對低階的C、C++要高上一些。所以在開始寫Pat題解之初,我還是選擇使用我最喜歡的JavaScript作為解題語言,不過我很快就發現了更好用的語言:C++。
為什麼是C++?
先說說JavaScript吧,為什麼不是JavaScript?第一個,也是最致命的一個點,不過也可能是我的問題,除錯不夠方便,因為JavaScript最初是面向瀏覽器開發,哪怕後來nodejs提供了更加低層的能力,但是其與標準輸入輸出流的互動並不足夠便捷,鑑於這一段的學習成本,我開始尋找其他的替代語言。
鑑於我對語言的掌握程度,第一個JavaScript的替代品是Java。我的體驗是,Java來寫ACM的題目,略顯拘束,Java為了物件導向,把C改造的過於徹底(Java曾被認為是C的某一種魔改)以寫起來沒有JavaScript那麼隨心所欲,也比不上C++那樣的快活。而且還有一個點,data object的支援,因為ACM判分系統往往不會是最新的編譯器,對這些特性支援的也少,所以沒辦法像C++和JavaScript那樣快速的,隨意地定義一個struct或者是object!
除上述以外,還有一個缺點是這兩種語言都存在的,就是慢,JavaScript實在是太慢了,哪怕用上了nodejs和V8,Java的速度也遠遠比不上C++那種接近C的迅速,往往同一段邏輯的程式碼前兩者要比C++慢上幾十倍到上百倍,如果考試的時候沒有時間只能暴力搜尋,估計C++會比JavaScript和Java更有優勢。
根據我在牛客等平臺看到的Pat題解,大多數都是用C++寫的,極少一部分是用的Java,除此之外基本沒有其他語言,所以如果用C++寫,可供參考的資料也比其他語言多得多,其學習成本也能被相對的抵消一點。
而且,選擇C++的一個重要原因就是它的資料結構標準庫STL!這是C++的標準庫,擁有多個實現,GCC,CLang等等對於STL的實現都不盡相同,在ACM的系統中大多是可以直接使用STL庫的,有了這個庫的幫助,對於堆,佇列等資料結構只需要熟悉對應的操作方法就能很方便地完成許多用其他語言十分複雜的題目!同時,C++還相容C的語法,大多數C的標頭檔案只需要去掉.h
再加上一個c字首就可以應用C++的實現,無縫銜接C的基礎,例如C語言中的scanf
和printf
比C++中的標準輸入輸出要快一些,所以可以用這些方法來加速程式碼。
如何快速入門、學習C++
首先,你要有C的基礎,最好曾用C寫過一些小程式,貪吃蛇之流的小應用以確保熟悉C的語法,然後再來學C++就會相對輕鬆。
C++有很多很多的標準庫方法,有時候想半天,最後發現別人用一個簡單的第一方實現的函式就能搞定,所以至少要熟悉C++的部分文件,推薦使用Dash來查詢文件,還可以嵌入到Alfred,當然這些都要充錢,我選擇放棄,或者用白嫖版...
從LeetCode到ACM
這裡ACM就指的是Pat考試型別的演算法題目,並沒有其他特別的含義。
其實LeetCode我寫的也不多,大概就寫了五十來道題,大多是簡單,中等的題目也多是抄來的,不過體驗上來說真的還挺好,因為它的測試用例會在你出錯的時候提供給你,方便你除錯,而且資料都是直接打包好傳遞到你要寫的那個函式中,省去了自己讀取資料的工作。
而ACM不一樣,輸入輸出都是自己控制,相當於你寫了一個單檔案,然後用標準直譯器、編譯器跑一遍原始碼,然後將程式碼的輸出和答案進行字串比較,怎麼說呢,從感覺上來說這樣更加純粹,掌控度也更高,不過在初期的難度上也高於LeetCode模式,如果你也是從LeetCode到ACM的話,需要適應一段時間。
從乙級到甲級
我沒有刷完乙級的所有題目,所以我的觀點算不得太全面,有興趣的朋友可以自己去寫一寫
乙級大概寫了十幾道題,剛開始還是寫的挺慢的,並且也受到C++前期難度的影響,覺得乙級的題目也不簡單,但是刷了六七題之後突然感覺一直寫這種難度的題目對能力的提升非常有限,大多數題目都只需要二三十行的程式碼量,並且可以一眼看到思路,也不涉及圖之類的資料結構,我就決定跳過乙級,直接準備甲級的考試。
不過如果剛開始上手C++和C++的STL,我覺得用乙級練手也是一個不錯的選擇。
甲級的難度跨度很大,題與題之間的差距可能比甲級和乙級之間的差距還要大,大多數題目都只有一個問題,有些會有好幾個小問題,有些直接用字串比較就能搞定,有些要用djikstra寫個百來行程式碼才能出點眉目,不過我甲級也只寫了二十來道題目,積累一些演算法的模板,後面就寫起來順手的多。
甲級的題目是英文的,有時候理解會出現偏差,導致怎麼都想不明白哪裡出錯,很多時候問題就出在一個單詞的理解不同,這種錯誤真的很難找...
從演算法到程式
大二的時候上資料結構,學的時候那叫個隨心所欲,想聽就聽,不想聽就玩手機,然後考試的時候就對著題目一臉懵逼,連重建二叉樹都沒想出來,真的是頭大。
演算法到程式是一種飛躍,從思想到現實的飛躍,程式不過是演算法對資料結構的組合操縱罷了,設計演算法是一種能力,實現出來也是一種能力,不然程式設計怎麼能算是一門藝術呢。
成文於2021年01月31日,13:16:14。