上大学之后几乎再也没有碰过编程算法一类的东西,也是浪费了很多的时间。大一的时候和两个学长组队,没怎么训练就上了场,看到英文题目发困,就打盹了半个小时,两个学长在那里研究,我醒了之后再次看题,没想到竟然有了两个题的思路,于是水了个acm区域赛的小铜牌。当然没有两个学长我肯定无法独立完成,因为那个时候代码水平已经下降了很多,因为平时做的模拟贪心搜索较多,也算是基础牢固一点。
那也是我最后一次见我的高中老队友,在接受采访。队里唯一一个女生,也和我一样拿了铜,也算是我们队的队花。有趣的是高中的时候也和我拿了一样的分数拿了省二,也都是因为一个小错误痛失了分数。如果我们之中有人能拿省一,也许会在某个普通的985或者211继续过着准码工的生活,翻出这张照片还是令人感叹时光飞逝,唏嘘不已。
从高中开始我就一直在用dev c++,我觉得简洁好用。我也知道将来入职,或者做什么工程,dev恐怕不足以效力,刚上大学那会vscode还比不上vs,于是下载了vs,结果根本没有坚持下去,也就删除了。最近重新拾起编程是因为研究生被电子工学的教授录取,来了之后发现虽然偏软件一点,但是对编程没有太高的要求。
本来正打算撸起袖子大肆研究一番密码学的时候,有一个不知道什么的活动教授要求参加,Arduino 的加密算法,学长写好了算法问我会不会汇编,想让我降时间,发现我不会之后叹了一口气。我看了看代码,看了看相关规范,发现其实和c没有太大区别,于是就盯着看了一天改了一天,有意思的是,因为不会汇编,于是组里其他人用了很幼稚的一些骚操作,比如一个for循环,竟然拆开成16个语句就为了降时间。
我看了半天没什么逻辑的错误,于是打起了函数的主意,我发现函数里面有几个参数是不变的,根本没必要调用,于是就删掉了,最后帮组里出了很小的一份力。这也是我重拾编程的契机。
codevs中的c++配置尤为困难,因为mingw下载页面最上面的一个版本竟然是很老的版本,这直接导致我编译的时候没法输入东西,我想了很多办法,重新下载了很多次,想了很多的原因,都没能成功,我本来以为是lanch.json之类文件的问题,因为刚刚创建的这类编译文件是空的,而且我看到别人的这个文件都是满的,于是就复制别人的,再改路径,结果本身又出了一些bug。虽然所有bug都提示打开lanuch.json,tasks.json这类文件,但是据我这一周的观察来看,改了只会增加bug,而无法编译之类的问题,一定是代码或者别的的问题。当然如果改了也很好修改,就是把文件删了,下一次编译它会自动再生成。
我气的没办法,最终删除了vscode,下载了visual studio,但是visual有几个很变态的点让我无法习惯,最大的问题就是,一个工程只能有一个main函数,我想编译一个代码俩个版本都不行,要很麻烦的改主函数或者手动设定。这又让我萌生了退意,同时我也怀疑是否vs真的有dev这么顺手,想着先用着dev大不了将来再改。但是用着dev又没什么新鲜感,索性直接再度放弃,此时已经浪费至少10天之久。
感谢一款游戏让我复活,那就是Screeps: World。一款硬核神作,需要编程基础和JavaScript。我在上面完全是零基础,于是跟着教程打了一个周才过,发现还是距离能玩这个游戏有相当差距,于是开始学习js。重点来了,js的编辑器推荐还是vscode,百般无奈之下,卸载vs,继续配置vscode。js的配置相当简单,但是由于强迫症的原因,导致我在极大的痛苦之下找到了c++没有配置好的原因,长舒一口气。
然而我的快乐游戏之路并没有开始,由于此游戏入门要求太高,我只能从头学习js,但是也对一些事情感到迷茫,从何处下手练习js,哪里有好的工程或者有意思的实践,对我来讲太过于陌生,我甚至没有学长可以咨询,因为各自都有自己的职业规划和方向,学js的没有。
于是想到了再次想到了算法竞赛。
再次打开洛谷,也注册了leetcode,开始了快乐的刷题之旅。然而leetcode和洛谷的输入输出方式有很大区别,我之前从未见过,调试也并不方便,本想打算放弃,但是今天花了一天时间,配置好了vscode的上的leetcode的环境,尝试写了系统推荐的一道题。
// @before-stub-for-debug-begin
#include <vector>
#include <string>
//#include "commoncppproblem946.h"
using namespace std;
// @before-stub-for-debug-end
/*
* @lc app=leetcode.cn id=946 lang=cpp
*
* [946] 验证栈序列
*/
class Solution {
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
bool a[10000]={0};
int minx=10000;
int b[10000];
for(int i=0;i<popped.size();i++){
if(minx>pushed[i])minx=pushed[i];
}
for(int i=0;i<popped.size();i++){
pushed[i]=pushed[i]-minx;
popped[i]=popped[i]-minx;
}
for(int i=0;i<pushed.size();i++){
b[pushed[i]]=i;
}
if(popped.size()<3){
return true;
}
a[b[popped[0]]]=1;
for(int i=1;i<popped.size()-1;i++){
a[b[popped[i]]]=1;
if(b[popped[i]]<b[popped[i-1]]-1){
for(int j=b[popped[i]];j<b[popped[i-1]];j++){
if(a[j]==false){
return false;
}
}
}
}
return true;
}
};
这逼题妥妥的模拟栈就完事,但是我想出了一个特性,就是只要后面出栈的一个数的输入顺序小于前面的至少2就从这个数到前一个数的顺序进行遍历,然后没被访问就说明不可能。我看这道题五分钟就有了思路,奈何好久不打代码,一个破题打了这么久。现在已经到了凌晨两点。
才发现了vscode的好处,各种语言都有,各种功能随便加,参数的观察也更加全面。
但是也有缺点,就是竞赛环境不够稳定,有时候会卡出调试,不过我相信会越做越好。
未来怎么样,我不清楚,我觉得要做到三件事:
1,学好教授要求的密码学,工学知识,将来也许可以转型互联网安全或者区块链。
2,坚持刷leetcode,坚持每周学习新的算法并实现。并且尝试用js编写,为将来做纯码工做准备。
3.英语,韩语必须持续练习,在毕业之前争取把韩语说的和母语一样好。
我宣布这个博客正式复活!就写到这里吧!