从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语言中的scanfprintf比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。

从一片森林(JavaScript)到另一片森林(C++)的更多相关文章

  1. #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著,但并不是越多越好),加上verbose=True,显示进程使用信息

    #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著) from sklearn import datasets X, y = datasets.make_c ...

  2. CF731C Socks并查集(森林),连边,贪心,森林遍历方式,动态开点释放内存

    http://codeforces.com/problemset/problem/731/C 这个题的题意是..小明的妈妈给小明留下了n只袜子,给你一个大小为n的颜色序列c 代表第i只袜子的颜色,小明 ...

  3. javascript学习教程

    我来班门弄斧一下吧,把我JavaScript学习过程中常去的一些网站分享给大家: =========================增加================================ ...

  4. 关于 JavaScript 学习 —— 好的博客或者网站推荐

    作者:Tw93链接:https://www.zhihu.com/question/19651401/answer/46211739来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  5. 机器学习回顾篇(12):集成学习之Bagging与随机森林

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  6. 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

    图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...

  7. 【BZOJ3669】[Noi2014]魔法森林 LCT

    终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...

  8. kaggle数据挖掘竞赛初步--Titanic<随机森林&特征重要性>

    完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...

  9. BZOJ 3669 【NOI2014】 魔法森林

    Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...

随机推荐

  1. 扫盲:Kotlin 的泛型

    引子 相信总是有很多同学,总是在抱怨泛型无论怎么学习,都只是停留在一个简单使用的水平,所以一直为此而备受苦恼. Kotlin 作为一门能和 Java 相互调用的语言,自然也支持泛型,不过 Kotlin ...

  2. Qt学习笔记-了解信号与槽-自定义信号-自定义槽

    信号与槽是连接不同控件直接的渠道. 这里以Horizontal Slider和Dial两个控件举例. 目的是在改变滑条的数值时,Dial也随之响应. 首先添加两个控件. 然后按快捷键F4进入控件编辑模 ...

  3. Redis中的常用命令哪些?

    a.hset 存储一个哈希键值对的集合 b.hget获取一个哈希键的值c.hdel 删除一个或多个字段 d.hgetall 获取一个哈希是键值对的集合 e.lpush key value向链表左侧添加 ...

  4. Light Probes

    LightProbes (光照探针,光探测器?) 提供了一种方法用于捕获和使用 穿过场景中空白空间的 光(light)的信息. 和光照贴图相似(lightmaps),Light Probes也存储关于 ...

  5. mysql事务_事务隔离级别详解

    使用事务语法 1. 开启事务start transaction,可以简写为 begin 2. 然后记录之后需要执行的一组sql 3. 提交commit 4. 如果所有的sql都执行成功,则提交,将sq ...

  6. eclipse开启的时候adb.exe会自动开启么 怎么让它跟着eclipse自动开启

    会的,Eclipse 参数页中的 General > Startup and Shutdown 中默认 Android Development Tools 是自动激活的,它会启动 adb.exe ...

  7. pydub "Couldn't find ffmpeg or avconv - defaulting to ffmpeg" 问题解决

    我通过 命令行安装了pydub库,运行报了如下错误 RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but ...

  8. 「每日一题」有人上次在dy面试,面试官问我:vue数据绑定的实现原理。你说我该如何回答?

    关注「松宝写代码」,精选好文,每日一题 ​时间永远是自己的 每分每秒也都是为自己的将来铺垫和增值 作者:saucxs | songEagle 来源:原创 一.前言 文章首发在「松宝写代码」 2020. ...

  9. Phoneix(二)HBase集成Phoenix安装

    一.软件下载 1.访问:http://phoenix.apache.org/ 2.点击: 3.进入以下内容:点击 4.跳转到 5.跳转到 6.点击安装包,进入 点击进行下载: 二.安装 phoneni ...

  10. netcore项目中使用 SpringCloudConfig 和apollo做配置中心

    版权所有,转载请注明出处 https://www.cnblogs.com/netqq/p/14251403.html 一.使用apollo作为配置中心 首先apollo 项目简介和安装请自行百度,本文 ...