从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写个百来行代码才能出点眉目,不过我甲级也只写了二十来道题目,积累一些算法的模板,后面就写起来顺手的多。