首页 > 寺庙

我的年|

我的年

我今年25岁,有两个别人很羡慕的两个哥哥,但是我基本上没有主观意识上感觉到自己因为两个哥哥有多幸福。

我的年|

我刚出生的时候,大哥是十岁,二哥六岁,一家五口人差不多在一个10平米的房子里,有两张床,哥哥们一张床,我妈搂着我和我爸睡。后来家里开商店,刚开始的应该是现在被称为的“摆地摊”的那种状态,没有货柜,没有门面,就是一个棚子能挡雨不能遮风那种,地上铺个垫子,摆一些东西。爸妈常常会因为钱的问题会吵架甚至动手打架。在我小学、初中的阶段基本是三天一小吵七天一打架,我是女生,跟我哥年级相差不小,大哥在我开始慢慢懂事的时候已经出去打工了,所以爸妈吵架的现场基本是我和我二哥,二哥属于安安静静、不悲不喜、学习很好,基本没有什么能动摇他的,爸妈吵架、打架的情况从小基本都是我在劝架,但是我妈这个人就是吵架什么的不能也因为这个常常成为了那个被骂的最难听的那个人,我妈属于打一巴掌给一颗糖的类型,心里不知道反反复复骂过她多少次,下过多少次决心不再理她,最终还是没有成功。说不上可恨,但是总归从小我是没有自尊心的,我的自尊一直是被她踩在脚底下转身又被她捡起来洗洗干净的那种状态。

我印象中爸妈吵架的一部分原因还有是因为我爸年轻的时候的一些事,年轻的时候我爸用家里借的一点钱买了一个三轮车,给人家拉货,出过车祸,但是因为这件事,我们家赔惨了,虽说不是主责,但是对方因为要住院还有最后没有活下来的原因导致我妈赔了一大笔的费用。从那之后我爸再也没有碰过车,电瓶车也没有。

我小时候算是我大哥养大的,当时在上初中,一放学就先给我喂饭,他吃完之后,就背着我出去玩了,有一次,吃完饭去山上,他没注意头顶的枣刺,就往前走,结果就是那颗枣刺很巧的剐到了我的右眼下眼皮的地方,但是就流血了,把我哥吓得就往回跑,回去之后应该就是在我们当地的卫生所给我缝了几针,疼不疼的倒是忘了,就是到现在还是能看清楚,右眼下眼皮的一点点疤,我倒是没有什么抱怨他的,只不过庆幸当时那颗枣刺没有再高一点刺到我的眼睛。

小时候喜欢光屁股,一到夏天衣服基本穿不住,大夏天的热烘烘的柏油马路,就赤脚踩在上面,跑来跑去,邻居家的伯伯一看到我会吼我“赶紧回去穿衣裳!”,我就呼啦呼啦的跑回去,身上挂着一个不知道是我妈从哪拿来的大衫子,浪个两圈,就挂不住扯掉了,就这么来来回回,一天一天就这么过的。后来的有一天,我妈嫌我一个女孩不穿衣服,就实在受不了了,骂着、打着让我穿衣服,我非不穿,我妈气到不行,后来好几次一直在跟我说说我不是亲生的,有时候说我是黄河发大水捞上来的,有时候说我亲生爸妈在山沟沟里,说的最真的是说我是从对面山西运城抱来的娃(我们家在山西、陕西、还有河南的交接处,出门门口就是黄河)。有一次依旧因为衣服的事,我妈吼我“回你山西去,不要你了!”。我就背着我的小书包(里面都是馍块块)就走了(我们家当时出门就是大马路),沿着马路边一直走呀走,我妈没想到我就这么就走了,快走到她的视线之外的时候,就喊我爸拉我去,把我拉回来,把我妈气的,以后再也没说过我是从哪里哪里来的了。

到上幼儿园的年级(我上幼儿园比别人早两年,因为我妈开商店,顾不上照顾我,还不如送幼儿园去),我们那里的幼儿园应该是“托管班”的历史了,邻居家的阿姨,附近村子里的小孩都在那里,印象最深的是小时候跳的那个“兔子舞”,还有铁片做的带楼梯的滑板,印象不深,但是隐隐约约有这些东西。我妈眼中我的幼儿园就是真的是吃货了,说是我去幼儿园书包里永远都是吃的,有的是从家里小商店偷的小吃的,有的是馍块块。直到有一次,我放学回来准备吃饭的时候,我妈看见我的手拿不住勺子,就问我咋了,我没吭声,我妈拿起我的手看,当时的手已经肿的不行了,就说“谁打的?”,我没说话,我妈一把拉着我就往邻居家阿姨那去了,“你为啥打我娃?把娃都打成这了,饭都吃不成了”,“你娃上课不好好听东瞧瞧西望望,一会吃一点一会吃一点,也不写字”。我妈听完一下子就给我屁股上来了一下。我也不敢哭,老师打我的时候眼泪都哭的差不多了。回到家,我妈说“那打你就是活该,谁让你不好好听课了,以后上学不准拿吃的”。从那之后我就知道一定要写字、学习。一直到高中我的成绩也算是还可以的,基本也算是没有让我妈操过心了。

我小时候特别爱吃火腿肠和鸡蛋,小时候一过生日就是鸡蛋,煮鸡蛋,我就很喜欢吃。有一次我哥过生日,我妈煮了鸡蛋,可能是当时那几天心情比较好,煮的还不少,一次没吃完,我就偷着拿了两个鸡蛋,两根火腿肠(家里卖的),躲在一个大柜里,里面黑黑的,我就开了一个缝,在里面就开始吃了,吃着吃着就睡着了,差不多有大半天的时间,我妈一开始以为我跟我哥出去邻居家玩了,结果我哥回来了还没有见我,就着急了,一个村一个村的跑,一家一家的问,就是没见过,到傍晚的时候,超级累超级累的回来了,然后就看见了我的一只脚在柜子外面耷拉着,“哈哈哈哈哈”我妈就笑了,打开柜子,我还睡的贼香。

从小都是“剪发头”(就是男孩子的发型),没有去过理发店,一直是我妈在家拿一片我爸用的刮胡子的刀片和一把梳子就解决了。小时候还不觉得,上初中的一个周末的下午,她在院子里给我剪头发,拿起镜子看了一下,越看越不对,越不顺心,越难受,就哭了,大哭那种,商店人多,我妈懒得理我,我越哭她就越骂我,恶性循环,来买东西的人不能劝,越劝越骂的厉害,当然我也习惯了,就是不知道他们为什么要劝,还每次遇到这种情况都会劝,现在感觉有一种想要看好戏的感觉。从那个时候开始,才感觉到一个我是一个女生。

我第一次的月事是在初三的时候,印象很深,因为是伴随着我印象中从小到大最严重的一次病来的。当时基本从厕所出来隔三分钟就要再去,去厕所要路过操场,在操场的一个老师发现了我,说我咋来来回回的,但是当时以为只是单纯的拉肚子,第一次来月事可能不舒服什么的,后来越来越严重,特别频繁的去也没有好转,我就问班主任请了假,为了节省一点钱,只是自己去要点买了一点拉肚子的药,路上给自己买了一瓶水,回来的时候大家都在上课,回到宿舍想吃了药想躺一会,结果没想到的是,躺了不到五秒钟,就恶心的不行,想要跑去卫生间吐,但是没忍住,在宿舍的楼道就吐出来了,不过幸运的是,因为拉肚子胃里面已经没有什么东西了,吐出来的都是刚刚喝进去的水,吐完之后就回去又躺着了。我再次有印象的时候就感觉到大家都回来了,舍友看见我在床上躺,头上一直在淌汗,喊我也不说话,就去叫老师了,班主任到宿舍看了一下,转身就要跟我妈打电话,我隐约看到她在打电话就想拦她,我现在都记得我说了“求你了,不要给我妈打电话!”我为什么这么排斥这个东西呢?应该是从小吧,从小,我爸我妈从来没有参加过我任何的学校活动,没有给我报过名,小学是我哥给我报名,初中以后就是我自己报名了,也从来没有给我开过家长会。所以我印象中我爸我妈都是忙到顾不上我们几个孩子的状态,也从来不想让他们操心,晕晕乎乎的就说出了那样的话。电话那头还是有人接了,我只知道打通了电话,就昏过去了,醒来是被宿舍阿姨喊醒的,当时大家都在午休,我爸在宿舍楼外面,火热的太阳晒在他黝黑的皮肤上,额头像是在发光,手上提着一个红色袋子,我不清楚那是什么,什么也没说,跟着他去了学校附近的诊所,“肠胃炎”医生说“要挂吊针,大概要一个礼拜”。开了药,一个阿姨给我挂了针,我躺在床上,看着我爸从那个红色袋子里掏出了几个鸡腿。“生病的时候营养要跟上。”就这么说了一句。学校在县城,往后的一个礼拜,每天都来学校接我去打针,从见到他的那一刻一直到他走,我印象中是没有说过话的。也不知道说什么,基本都是他跟诊所的大夫有一句没一句的说着......

我的年leetcode刷题总结

2020年过去了,我在leetcode上成功刷题1000+。

当然了,光追求刷题的数量是远远不够的。我如果把每道题选一个高赞答案然后ctrl+c,ctrl+v,点击提交,几天也能做到“刷题”1000+,但这就没有任何意义,别说别人了,自己都骗不了。

有人说了,我还没无聊到这样的地步,每道题代码都是自己写的。可这也是远远不够,比如50题,让你求一个数的pow(x,n),你如果直接写一个pow函数,也能在系统里solve这道题,但是就失去了这道题的意义。

那如何才能叫真正solve这道题?那就是

1,如果让你过一段时间,再让你重新做这道题,不给你任何提示,你还能做出来吗?

2,给你一道和这道题非常相像的姊妹题,你能顺利想到思路,解出这道题吗?

3,不给你任何编译器,让你直接在word文档里写出代码,然后你把代码copy到题目下面,点击提交,能没有任何语法错误,并且通过所有的test case吗?

4,你能顺利完成第三个要求,并且顺便向周围的朋友讲明白你的思路,所有的过程都在半小时内完成吗?(如果是在国外的话,你的英语能让外国人也听懂吗?)

以上的四个要求,一个比一个高,我目前很多medium和hard题的水平只能满足第2个,有几道hard题目甚至连第一个都做不到。而真正的算法面试,是需要满足第4个的。因此,我目前还远没有到面试的水平。当然,大家如果是刚刚刷题,不要直接要求4,否则很容易被劝退。

当然了,虽然我没有达到这么高的要求,但是刷题1000+,总归是有收获的。我的最大收获是,我不再畏惧写代码,甚至很享受它。

而且,因为经常参加周赛,我的编程水平确实有质的提升,在刷leetcode之前我虽然也会写代码,但是写出来的代码又臭又长(比如编程实现扫雷那个,现在看真是各种捂脸),而且我还以自己写了多少行为荣,完全不考虑任何的优化。

现在呢,不管是写什么样的代码,虽然不能保证一遍过,但是绝大多数时候只需要做一小点微调就可以了,不像以前,调bug的时间比写代码的时间还长。

还记得我第一次参加周赛的时候,自己费劲巴力只做出了第一题,排名在后50%,虽然比较丧气,但是我想:能做出一道题,说明我还是比那些完全不会编程的人强一点。然后后来,我就能做出一道easy难度一道medium难度的题目了。练习了300多道之后,我在某场周赛成功在最后几分钟拿下了最后一道题,那是人生第一次AK (all killed,表示全部通过)。虽然那场周赛很简单,1000多人都AK了,但是我还是很激动,毕竟人生第一次。当然,下一场比赛我就被打回原形了,印象中只做出了两道题。这也告诉我,永远不要认为你已经掌握算法,一次比赛表现好只是偶然,10次平均值才能说明问题。

现在呢,虽然我的成绩还是有起有落,在两周前的比赛还拿过1000多名(每次周赛参赛人数大约1万人),但是整体肯定是比以前好很多了,一般都至少能做出三题,时不时还能进个前200甚至前100,拿到奖励的leetcode coins。新年最后一次比赛,我的名次是156名,这让我的rating总排名进入了前1000。这是我的曲线,整体还是向上的。

我的周赛排名

说了这么多我刷题的经历,现在来分享一下我是如何做到的。

首先,大家刚拿到leetcode的时候,肯定都是踌躇满志,想着:“看我把它刷爆”。第一题,two sum,嗯嗯,简单,我一个二重循环就通过了。提交之后,丝毫没有注意到自己的时间只击败了5%的人,然后第二题......链表,这是什么玩意?放弃。然后第三题,longest substring....什么是substring?放弃。第四题一看是hard就直接跳过。之后就开始浮躁起来,觉得自己怎么这么笨,啥都不会,只会一些比如50题这样的一行代码就能过的题目(但是第50题意图肯定不是让你一行代码解决,而是考察你快速幂的知识,直接用pow过了没有任何意义),最后只做了少数的几道题。

如果你是上面的过程,不用气馁,因为一开始我就是这样的,这个时候,应该怎么做呢?

要做的是,迅速承认自己智商不足的事实。我不是高斯那样的天才,很多优美的算法,其实是数学家和计算学家研究了很长时间的,我怎么可能无师自通?要做的就是,第一次做不出来不丢人,要看别人的高赞解法。大家都是这么过来的。

比如第三题,需要用到sliding window算法,但是很多只学过数据结构,甚至只学过C语言的人,怎么可能知道sliding window?这个时候,就是要看别人的解法,看完之后自己尝试着去写。然后,通过以后,点击sliding window这个标签,会出现很多类似的题目,找一道简单难度的自己去做。按照tag刷标签是很高效的。

如果发现类似的题目还是不会刷怎么办?这也很正常,因为很多medium或者hard难度的题目需要同时用到多种方法,你要的方法,只是其中一环,而且往往还不是第一环,你无法转化成自己能解决的问题,自然就没法做。这样的题目往往是medium-hard难度。

另外,做题就一定要考虑的是时间复杂度。leetcode后期的题目,都会告诉你各个变量的取值范围,这个是非常重要的信息点,如果你题目做多了,就会发现,取值范围其实就暗示着作者想让你用什么样的算法。

N~16:可以用指数O(2^N)的算法

N~100:指数算法会爆炸,必须要用多项式算法。

N~500:时间复杂度不能高于O(N^3)

N~2000:时间复杂度不能高于O(N^2)

N~10^5:时间复杂度不能高于O(N log N)

N~10^9:时间复杂度必须为O(log N)或者 O(sqrt(N))

有那么一个公式,就是你的总计算次数不能超过10^7数量级,否则就会超时。这个在任何的编程竞赛中都适用。

另外,如果是多个变量,题目描述完全不变,改变变量的取值范围,就完全是不同的题目。比如数组的长度为M,每个元素取值范围是0-N,同样是分割成和相等的若干子数组,如果M很短,N很大,这可能就是一道backtrack问题,需要递归,但如果M很长,但每个元素取值只能到0-10,这就是一个背包问题,需要动态规划。所以有这么种说法,不给变量的范围就是耍流氓。

除了时间复杂度,还要看你的算法在所有方案中位置。很多人说一定要击败90%的人,其实没必要,你只要注意一下前面有没有一个高峰,并且峰值时间比你的一半还少就行。python算法不太稳定,12ms和16ms没什么区别,可能你上次提交击败50%,下次提交就95%了。

我在做题的时候,一开始我就是照抄别人的算法,一行一行理解,有些关键的代码,比如二分法的边界判定,比如union find,比如树状数组,则在理解的基础上直接背过。另外,如果长时间做不出来,则直接标记,过一个月再刷一下。

dp = [[0 for j in range(n)] for i in range(m)]

def getnext(a,b):

if a=m or b=n:return 0

if dp[a][b] 0:return dp[a][b]

num1 = ...... + getnext(a+1,b)

num2 = ....... + getnext(a,b+1)

dp[a][b] = max(num1,num2)

return dp[a][b]

用这种思想,在周赛中遇到DP类题,只要不是那种只有几十个人通过的变态难题,我基本都能解出来。

另外一种是堆(heap)问题,大家一定要重视,这种算法和BFS和DFS是同等重要的,BFS的实现是队列,先进先出,DFS实现是栈,先进后出,而堆则是不管什么时候进,都是最小(最大)出。我用堆这个思想,顺利解出了一大批leetcode的难题,而且对于最小生成树,最短路径问题,天际线问题等等,用heap简直不能再爽。大家一定要练好。

用这些方法,我刷题数量越来越多,而且参加周赛真的是对你编程的一次检验,周赛积分上升真的是正反馈,如果没有周赛的话我真的很难刷的下去。所以建议大家一定要多参加几次周赛,这样让你的刷题不再单调。

通过tag训练法,再加上周赛的激励,我实现了1000+刷题,接下来有什么目标呢?再追求2000+题目也没什么意义,因为我刷的题目已经够多了,现在就是要追求质量,争取我刷过的题目,都能一遍过,没有bug,而且讲明白。

而且,是时候把重心放回到其他方面了。比如我整个冬天都没怎么更新视频,再不更新大家就该把我忘了。

最后祝大家2021年心想事成!


|我的年

 

我的年|
  • 我的年leetcode刷题总结|
  • 我的年leetcode刷题总结| | 我的年leetcode刷题总结| ...