从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. 图解HTTP权威指南(三)| Web服务器对HTTP请求的处理和响应

    作者简介   李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络 ...

  2. [leetcode]138. Copy List with Random Pointer复制带有随机指针的链表

    public RandomListNode copyRandomList(RandomListNode head) { /* 深复制,就是不能只是复制原链表变量,而是做一个和原来链表一模一样的新链表, ...

  3. Mac电脑jsp连接mysql

    四个步骤教你如何用jsp代码连接mysql 第一步:下载jdbc驱动 进入mysql官网:https://dev.mysql.com/downloads/connector/ 找到Connect/J ...

  4. python谷歌序列化传输

    今日破解某app加密app当中用到了谷歌序列化传输 1.请求序列化文件 # Generated by the protocol buffer compiler. DO NOT EDIT! # sour ...

  5. JavaDailyReports10_07

    动手动脑① 1 package test_1; 2 3 public class Test { 4 5 public static void main(String[] args) { 6 // TO ...

  6. Redis 设计与实现 9:五大数据类型之集合

    集合对象的编码有两种:intset 和 hashtable 编码一:intset intset 的结构 整数集合 intset 是集合底层的实现之一,从名字就可以看出,这是专门为整数提供的集合类型. ...

  7. Sqoop(二)常用命令及常数解析

    一.常用命令列举 二.命令及参数详解 1.数据库连接 2.import 3.export 4.hive

  8. flume将数据写入各个组件

    一.flume集成hdfs,将数据写入到hdfs           a1.sources = r1           a1.sinks = k1           a1.channels = c ...

  9. Codeforces Round #695 (Div. 2)

    比赛地址 A (水题) 题目链接 题目: 给出\(n\)个面板,每个面板初始时间相同,每过1s面板上数字会加1(数字在\(0\sim9\)循环播放),任意时刻选择一个面板\(x\)使他的时间停止,其他 ...

  10. 洛谷 P4396 [AHOI2013]作业

    题目描述 题目传送门 分析 因为询问是关于区间的,并且没有强制在线,所以能用莫队解决 但是还要支持查询区间内大于等于 \(a\),小于等于 \(b\) 的数的个数和数值的个数 所以还要套一个数据结构 ...