我叫谙才思,是一名武汉理工大学的本科生。
距离我考完研已经过去两周,单调而重复的大四上学期也即将画上句号。此时此刻,我一个人坐在教一楼的一个角落中,后桌的情侣似乎已经回家了,桌上再无他们的摆放着的书籍;平日里结伴而行的学生们一个个拉着行李箱出发回家,图书馆旁落下的枯叶铺在车道上。
我快毕业了啊,我这才想起,过去一年里一直准备着考研,似乎大三对我而言只是一个用来框住我去每天学习的时间节点,这一年的全部重心都在考研上,我放弃了去社交认识新朋友,放弃了去学小提琴,放弃了很多和女朋友在一起的时间。如今同学们该报研的保研,该就业的也签好了约,感觉只有我还是对于未来是迷茫的,因为我不知道自己能不能上岸呢。
今天回忆起从前大学那三年,感觉学到了东西,又感觉没学到东西。人总是回后悔从前,但其实放在那个时间节点,每个人都是迷茫的,当时的你,只拥有当时的有限认知和想法,又怎能预料未来之事呢。
这个世界上,优秀的人太多了,他们的优秀,是每天一点一滴积累起来的,或许,优秀的人每天只睡6个小时,又或许,优秀的人工作的时候都是全神贯注的。我不如他们优秀的原因,就在于每天都不如他们优秀。
我其实并非想要忏悔自己,因为我也最清楚自己就是可能就是这样之人,无法忍受长期之痛苦,希冀转变,渴望一战成名。即吾虽有志,却困苦于无厚积薄发之力,你在成长,别人也在成长,越往后优秀的人优秀的也就越明显,彼时,可能虽有积,但相比之下,难以言厚也。
开此日记,以明吾日三省之意图,时常反思自己,时常回过头来总结教训。大学三年似乎有些浑浑噩噩,原因在于我还是没能时常反思自己,心有目标而步子却不知迈向何方。
1.11 今日规划:复习昨天的两道Acwing算法题+继续往后刷两道算法题+初步入门深度学习
昨天在Acwing上刷的两道题,一个是单链表还有一个是双链表,收获在于知道了在机试写算法的时候不应该用结构体,因为这样每次new一个struct的时候耗时太长。用数组代替结构体中的数据域和指针域可以同样起到链表的作用,在写代码的时候还是会犯一些错误,像传入数组下标的时候没有-1,又或是对数组形式的链表结构还是没有理解清楚,写循环遍历和增删条件的时候脑子里一团浆糊。后面得抽空复习复习这两题(虽然不知道什么时候才能抽出空来复习,这取决于我主观上有没有想动脑回忆的意愿)
下午花了4个小时回顾了昨天的算法,今天的两道算法题一个是用数组模拟栈,这个比较简单,虽然c++中有内置的stack栈,但本题中用一个变量去模拟指针,用对数组的操作去模拟进栈和出栈,关键点就是在于先动指针再入(出)栈还是先入(出)栈再动指针,以及对指针进行的判空操作。
第二题是考研数据结构的老朋友了,表达式求值,精髓是双栈。但之前学的时候听咸鱼学长讲一直都是只知道手动过程而不知道代码实现,今天还是被这道题难住了一会儿:
#include <bits/stdc++.h>
using namespace std;
const int M = 100010;
string s;
stack<int> num;
stack<char> op;
unordered_map<char, int> h{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
void eval(){
int a = num.top();
num.pop();
int b = num.top();
num.pop();
char c = op.top();
op.pop();
int x;
if(c == '+') x = b + a;
else if(c == '-') x = b - a;
else if(c == '*') x = b * a;
else x = b / a;
num.push(x);
}
int main(){
cin >> s;
for(int i = 0; i < s.size(); i++){
if(isdigit(s[i])){
int x = 0, j = i;
while(j < s.size() && isdigit(s[j])){
x = x * 10 + s[j] - '0';
j++;
}
num.push(x);
i = j - 1;
}
else if(s[i] == '('){
op.push(s[i]);
}
else if(s[i] == ')'){
while(op.top() != '(')
eval();
op.pop();
}
else{
while(op.size() && h[op.top()] >= h[s[i]])
eval();
op.push(s[i]);
}
}
while(op.size()) eval();
cout << num.top() << endl;
return 0;
}
被难住的点主要是这一块:
内层之所以还有一个while循坏是因为,当读入一个不止一位的数字时,需要对其进行从string到int的类型转换,而x = x * 10 + s[j] - '0'就是其固定的转换公式。x * 10可以理解为分别对于个位、十位、百位...上的数字的计算,s[j] - '0'就是将ascii码转为int型数。
至于为什么要另外弄一个j,是因为在外层循环的时候,不知道这个数有几位,用if去代替while作判断的话,那永远只能判断个位数。
而最后的i = j - 1不能写为 i = j,是因为在最外层循环结束时,i会++。
另外我还学习到了,在c++中unorder_map的底层是哈希表,而map的底层则是红黑树;size和length作用是一样的,只不过size可以求vector类型的长度。
晚上继续深度学习!