從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。