从一片森林(JavaScript)到另一片森林(C++)
从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。
从一片森林(JavaScript)到另一片森林(C++)的更多相关文章
- #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著,但并不是越多越好),加上verbose=True,显示进程使用信息
#调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著) from sklearn import datasets X, y = datasets.make_c ...
- CF731C Socks并查集(森林),连边,贪心,森林遍历方式,动态开点释放内存
http://codeforces.com/problemset/problem/731/C 这个题的题意是..小明的妈妈给小明留下了n只袜子,给你一个大小为n的颜色序列c 代表第i只袜子的颜色,小明 ...
- javascript学习教程
我来班门弄斧一下吧,把我JavaScript学习过程中常去的一些网站分享给大家: =========================增加================================ ...
- 关于 JavaScript 学习 —— 好的博客或者网站推荐
作者:Tw93链接:https://www.zhihu.com/question/19651401/answer/46211739来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- 机器学习回顾篇(12):集成学习之Bagging与随机森林
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- 【BZOJ3669】[Noi2014]魔法森林 LCT
终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...
- kaggle数据挖掘竞赛初步--Titanic<随机森林&特征重要性>
完整代码: https://github.com/cindycindyhi/kaggle-Titanic 特征工程系列: Titanic系列之原始数据分析和数据处理 Titanic系列之数据变换 Ti ...
- BZOJ 3669 【NOI2014】 魔法森林
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
随机推荐
- [LeetCode]148. Sort List链表归并排序
要求时间复杂度O(nlogn),空间复杂度O(1),采用归并排序 传统的归并排序空间复杂度是O(n),原因是要用一个数组表示合并后的数组,但是这里用链表表示有序链表合并后的链表,由于链表空间复杂度是O ...
- 解决npm ERR!
一:[Unexpected end of JSON input while parsing near]报错 最近的vue项目中在执行 npm install 时会报错误: npm ERR! Unexp ...
- 事件驱动之JDK观察者模式
JDK中关于观察者模式主要了解俩个概念 Observer观察者 Observable事件源:当事件源发生某事件时,有两个事情需要注意 1.里面有一个isChange属性 当为false时不会发通知给 ...
- scala模式匹配 case a @ b语法
class caseTest { def main(args: Array[String]): Unit = { val c = Person(Student(1),"a") c ...
- 学习记录——使用PHP实现数据增删查改等基本功能(前后端分离)
萌新初次学习服务器端语言,分享学习经验 实现功能:1.显示数据表 2.对数据进行分页 3.对数据进行增删查改 由于本萌新采用前后端完全分离方案,所以数据传输用的ajax,为了提高代码的复用 ...
- 科来网络通讯协议图2019版(OSI七层模型)
来源:http://www.colasoft.com.cn/download/protocols_map.php 自己把它转成了图片,好做查看:https://www.lanzous.com/ib5h ...
- 新蜂商城的mybatis plus版本,添加了秒杀专区、优惠卷领取以及后台搜索功能
本项目是在newbee-mall项目的基础上改造而来,将orm层由mybatis替换为mybatis-plus,添加了秒杀功能.优惠劵功能以及后台搜索功能,喜欢的话麻烦给我个star 后台管理模块添加 ...
- 【MySQL 高级】索引优化分析
MySQL高级 索引优化分析 SQL 的效率问题 出现性能下降,SQL 执行慢,执行时间长,等待时间长等情况,可能的原因有: 查询语句写的不好 索引失效 单值索引:在 user 表中给 name 属性 ...
- 【Flutter】功能型组件之数据共享
前言 InheritedWidget提供了一种数据在widget树中从上到下传递.共享的方式,例如在应用的根widget中通过InheritedWidget共享了一个数据,那么便可以在子widge ...
- python基础语法1-变量
l Python基础语法1-变量