从一片森林(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同学在号节 ...
随机推荐
- 工具类输出当前ApplicationContext所有被装配的类
package org.springblade.desk.utils; import org.springframework.beans.BeansException; import org.spri ...
- 在wildfly 21中搭建cluster集群
目录 简介 下载软件和相关组件 配置domain 创建应用程序 部署应用程序 集群配置 总结 简介 wildfly是一个非常强大的工具,我们可以轻松的使用wildfly部署应用程序,更为强大的是,wi ...
- git使用下
Git 内部工作原理 Git 本质上是一个内容寻址文件系统,最初是一套面向版本控制系统的工具集,而不是一个完整的用户友好的版本控制系统.因此它还包含了一些用于完成底层工作的命令,这些命令被称为&quo ...
- react项目中登陆注册验证码的倒计时,页面刷新不会重置
目前很多的网站和app在做登陆注册时都会用到手机验证码,为了防止验证码轰炸,也就是随意的点击验证码,一般我们需要对获取验证码进行一些限制,最常用到的是在规定时间内不得重复发送. 实现倒计时很简单,可以 ...
- Cookie和登录注册
1. 什么是Cookie? 服务器通过 Set-Cookie 头给客户端一串字符串 客户端每次访问相同域名的网页时,必须带上这段字符串 客户端要在一段时间内保存这个Cookie Cookie 默认在用 ...
- 如何在 Linux 系统查询机器最近重启时间
如何在 Linux 系统查询机器最近重启时间 在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到 ...
- 用漫画的形式展现——URL和HTTP
http请求内容:请求头:get.post等发送请求(其他:head.put.delete.option) host 地址 user-Agent cookie 通行证 head:与get请求类似,不同 ...
- 使用postman添加cookie失败和cookie消失问题
例如 groupId=2; path=/; domain=.www.baidu.com; HttpOnly; Expires=Tue, 16 Jul 2019 03:42:12 GMT; 添加失败和c ...
- LeetCode 面试题16.18.模式匹配
模式匹配 题目: 你有两个字符串,即pattern和value. pattern字符串由字母"a"和"b"组成,用于描述字符串中的模式.例如,字符串" ...
- 前端面试:Http协议与浏览器
Http与Https的区别 Http是明文传输的,Https协议是在Http协议上添加了SSL的加密协议,可以进行加密传输和身份验证. 其实就是说Http对网络传输完全是裸奔状态,也就没办法防范中间人 ...