范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

写了三百篇算法题解,关于如何刷题有些话我想对你说

  这篇文章憋了我挺久的,感觉都快憋出内伤,一次次的打开 Typora 写几十个字,一次次的修改删除最后关闭 Typora,如此反复。
  为什么会如此纠结?
  或许是太狂妄了,我真的想让那些看了这篇文章的人都能从中受益,无论是算法小白还是高手,导致文章的立意拔的太高,高到我驾驭不住,远远超出了我的实际水平,于是一次次的开始写,一次次的废除。
  直到最近才想明白我应该写一篇什么样的文章,这篇文章的目标群体不是那些立志于参加 ACM 的大佬,也不是早早的就是刷了好几百道 LeetCode 的高手, 而是那些徘徊在要不要刷题、如何刷题的算法初学者们 ,我问自己,当年还是小白,为了进大厂,在珠江新城艰难挤上地铁后打开手机日复一日不断的重复看算法面试视频时, 是否想要看这样的文章来确定方向,我的答案是会,收藏然后狠狠地点个赞仔细的看。
  开头稍微啰嗦了几句,下面开始进入正题。
  不知道你们一开始刷算法题的时候是否有过如下的困惑。  1、题目很长,半天看不明白是什么意思  2、明明看懂了题目,但写出的代码却提交不通过  3、代码写到一半发现不知道怎么往下写了  4、别人的题解一看就懂,但自己想破脑袋都想不出要用这种方法  5、即使刷了两百多道题目,面试的时候一紧张还是会头脑空白发慌
  你问我为啥知道这些?因为我都经历过。
  我们都是从应试教育中厮杀出来的,所以对刷题应该是挺熟悉的,缺的只是方法,人人都可以是小镇做题家。
  方法是什么呢?
  可以归纳为两个,一个是战略,一个是战术,犹如行军打仗,两手都要抓。
  在战略上,我们需要做到的是藐视算法题。
  在战术上,我们需要做到的是重视刷算法题。  一、战略上藐视算法题
  在战略上藐视算法题的目的是为了在心理层面上克服恐惧,事实上,不仅仅是算法题,诸如学习计算机基础、计算机网络、编译原理等程序员必备的知识时,有这个心态可以学起来事半功倍。
  我亲身经历过这样的改变。
  作为一个转行程序员,在转行学习编程的那段日子,没有人告诉我说要去学数据结构,也没有人告诉我说要去刷 LeetCode,都是靠自己一个人摸索,绝大部分的时间都花在具体项目上,误认为自己和那些已经工作的程序员的区别在于有没有做过项目。
  这就是科班出身和非科班出身的学生最大的区别,科班出身的学生知道去学什么,知道大学期间安排的每一门课程是干什么的,知道要先去做哪些小项目来循序渐进的编码练习,知道知识点在工作中能起到什么样的具体作用,非科班出身的程序员感觉计算机相关的知识点简直是一团乱麻。
  这种情况导致我去找工作参加面试的时候,很多基础面都通过不了,最后侥幸进入一家要求不太高的创业公司,薪资不高,为了进大厂必须完善算法和计算机的知识。
  因为未知,所以恐惧,恐惧导致盲目的崇拜,我认为那些科班出身的程序员太牛逼了,居然可以掌握那么多繁杂的计算机知识;那些写源码分析的程序员都是大神;那些写算法题解的程序员都是高手。
  恐惧把小的问题放大,比如学到单调栈、双向链表、记忆化的内容,一看到题目要用到这些概念便觉得代码很难写,索性那些内容就不看,所以学了大半年还在原地踏步,还在原来的公司拿着微薄的工资做着 CURD。
  几个月后,创业公司不行了,受迫于重新找工作的压力,只好咬着牙再去啃,再去刷题。
  而当我开始写题解、做动画的时候,我就发现算法题也就那样,缺的只是时间去不断的重复练习。
  单调栈无非就是在栈的概念基础上增加了排序,记忆化也就是增加一个数组用于存储,动态规划在面试和实际工作中用到的只需要掌握百分之五就行。
  抱着编程技术也就那样的心态,学习了爬虫以及 Vue。
  "自大"的认为爬虫能有多难,基本步骤无非以下几步:  1、找到需要爬取内容的网页URL  2、打开该网页的检查页面  3、在 HTML 代码中找到你要提取的数据  4、写 Python 代码进行网页请求、解析  5、存储数据
  下载安装 Pycharm,安装 Scrapy,根据步骤输入 URL 和数据格式,在完全不懂分布式、ip代理、js加密、模拟登陆、MongoDB的前提下,顺利拿到了自己想要的数据。
  无论是分布式还是ip代理,爬虫的每个知识点深挖下去都大有文章,我所学习到的爬虫知识只是冰山一角,但这并不妨碍我们可以从战略上去蔑视编程,编程的很多内容没有那么高不可攀,缺的只是时间去学习,时间恰恰是我们可以去支配的。  二、战术上重视刷题
  战术,分为道与术。  道
  回顾一下我们以前学数学的过程,会发现,数学题有千千万,最后在脑海中记住的并非是这道题的具体写法,而是解这道题的思路。
  算法刷题同样如此,很难做到让你把做过的题目代码都背下来,然后在面试的时候一五一十的写出来,但是你可能知道这道题的思路,用什么样的数据结构和什么样的算法思想,知道可以用这样那样的方法做出来,差的就是细节。
  也就是说,刷题和应试教育中的学习是一样的,都需要先经过大量刻意的重复练习,见多识广,才能在面试时做到游刃有余。
  说白了,就是要多刷才行。
  这里的多刷题,不是指多瞎刷题,而是有方法的去刷,有目的的练习,而一个合理的练习方式,比练习的时间长短,更为重要。
  如何做到有目的的进行练习,大概可以分为以下五个步骤:
  1、找到具有定义明确的具体特定目标 2、具有专注练习的状态 3、找到导师模仿练习 4、走出舒适圈,突破自我 5、强化前行的理由  1、找到具有定义明确的具体特定目标
  目标必须是十分具体的,可以逐个解决,把目标进行分类并制定一个可实施的计划。
  目标是什么?
  通过算法面试不是目标,而是一个结果,我们的目标是怎么样合理的刷完算法面试需要的那些题目,推荐的做法是按照标签来刷,难度上循序渐进,即把多种同类型的题先放在一起来做,比如一个时间段,只刷链表题,待刷得差不多的时候,接下来再刷二叉树的题。
  由于不断的刷同个类型的题目,相当于在不断的重复练习,可以不断地加深自己对某个数据结构的理解,刷到后面可能发现这类题目都是有固定的套路,甚至一部分代码都是一模一样的。
  这种刷法不仅在大方向上找到具有定义明确的具体特定目标,即合理的刷完算法面试需要的那些题目,与此同时,当刷同类型的题目出现困惑时,也能有目的性的去搜索相关的特定资料。  2、具有专注练习的状态
  不建议在一开始刷题就去搜索一些模板来背,然后在解题的时候套模板,这样的刷题只是重复而不是练习,收获的只是经历而不是经验,背的再熟练,平时写的多块,没有自己的一个完整思考过程,在面试时很容易卡壳。
  在刷题的过程中,争取做到三件事:
  1、当写出 AC 的代码时,思考为什么自己可以做到
  2、当写出 AC 的代码时,思考能不能优化一些
  3、是否用到了题目给出的所有条件
  很多题目都是由相似的题目改编而来的,增删一些条件题目的难度就会发生巨大的提升,基于这三个思考,每道题目都去多想一步,一步一步再一步,不同维度不同姿势都尝试一下,不要满足于一种解法,各种解法都写一写,争取做到 beat 100%,把每个题目都做干净,彻底攻克一道题。  3、找到导师模仿练习
  搜索任何一道算法题,在网上都能发现不少文章,不过很多文章都是只提供解题代码或者加上一些简单的文字说明,为什么要这么写以及是怎么样想到这些方法的很少有文章会涉及到,这些人是高手,却不是导师。
  高手和导师最大的区别在于,很多高手未必可以总结出自己的方法论,他们真的很牛逼但核心内容却只可意会不可言传,而导师一定有一套可以复制的方法论,他或许不一定是最牛逼的,但却是最适合模仿学习的。
  目前 LeetCode 的题解区有不少大神写了不少细致的题解,找几个你看的顺眼的,模仿他们的思路去思考问题。
  然后悄咪咪的吹一下自己,我利用动画的形式讲解算法,写了几百篇文章了,期间有不少人也在模仿我的风格去写作,取得了不错的效果,我最近把精力花在自己的个人网站 AlgoMooc 上,立志于更加细致的讲解 LeetCode,如果你找不到合适的导师,不妨访问 https://www.algomooc.com 来看看我的文章,我争取每道题目都录制视频,用五分钟讲清楚。  4、走出舒适圈,突破自我
  当我们跌跌撞撞的刷了一些题目时,实际上,刷题已经变成了我们的舒适圈,在这个圈子中,你已经可以熟练的掌握了一些知识,如果我们想让练习取得成绩,我们得逼着自己走出舒适圈,最好的方法是自己去写题解,写一篇新手也能看懂的题解。
  也就是熟知的 费曼学习法 。
  什么是 费曼学习法 呢?
  简单来说就是以教促学,每当你认为学会或者掌握一个知识后,去给别人讲明白,通过这种方式对自己做一个检验,突破自我。
  李笑来曾经分享过一个观点,他说教育主要分为 3 个环节——  1、 教:我们最常做的读书、学习、听课等  2、 练:就是练习,大量练习,重复练习  3、 教练:在练习过程中遇到问题,教练帮忙指出来,然后继续练。
  1、2 不断循环,直到把知识、技能练熟,能用到实践中,帮自己做成一些事情,创造价值。
  以此作为参考 ,刷题也是可以分为 3 个环节--- 1、学:阅读别人的提交  2、练:就是练习,模仿别人的思路来练习  3、教:就是教练,通过写题解的形式给别人讲明白一道题目
  1、2 两点属于被动学习,吸收效率在 10% 至 30% 之间,而 3 属于主动学习,也就是费曼学习,吸收效率高达 90% 。
  也就是说,我们在刷题的过程中,为了提高学习效率,可以主动的去写技术博客分享,注意是写技术博客而非技术笔记,笔记是给自己看的,博客是给别人看的,在这个过程中,表面上你是在教会别人,事实上你通过教会别人的方式来逼自己查缺补漏,你可能以为你懂了,结果发现无法表达出来,事实上还是没有理解透彻;你以为你讲明白了,别人一问,发现还是有遗漏点。  5、强化前行的理由
  当初你觉得进行刷题提升自己的时候,什么是你的动力?
  这个问题最好在一开始的时候就想清楚,并记录下来。
  在《思维的囚徒》一书中,提及到一个原则,叫:自由地选择你的态度 —— 人无论在什么情况下,都可以自由选择自己的态度。事实上,任何一件事情,我们都能找到它的意义,它能帮助自己变得更好的角度。
  刷题这个过程必然是有难度的,会给自己很大的压力,所以一开始先把你认为刷题后能带来的积极结果写下来,越多越好,不管现实与否,每当你想要放弃的时候,多想想这些积极的结果,想想熬过这个痛苦的过程能提升多大的改变。  术
  道 是从宏观角度来思考刷题,那么术 则是在微观的角度来看待每一道题目。
  在具体做题的时候,可以采用以下三个步骤来进行。  1、看懂题目  2、分析解法  3、代码实现  1、看懂题目
  首先就是明确题目要我们解决的是什么问题?提供了哪些参考示例?是否提供了需要使用的数据结构和算法?时间复杂度或者空间复杂度有没有要求?提示的范围有没有比较特别的数?边界情况是否需要特殊处理?
  怎么样去看懂题目呢?
  给你个公式步骤进行参考,即  四步分析法  ! 模拟:模拟题目的运行。  规律:尝试总结出题目的一般规律和特点。  匹配:找到符合这些特点的数据结构与算法。  边界:考虑特殊情况。
  结合一道具体的算法题来说明整个过程,算法题来源于剑指 offer 上的例题:矩阵中的路径。
  1、模拟
  首先看一下矩阵的 初始状态 。
  我们需要在这个矩阵中寻找目标字符串  bfce ,第一步要做的就是先匹配上目标字符串的第一个元素 b ,我们从矩阵的第一行第一列的元素开始匹配,找到了 a  。
  目标字符串为  bfce ,此时查找第一个元素为 a ,与目标字符串的第一个元素 b 不相同,需要在四个方向搜索,看看能不能找到符合要求的元素,我们按照上左下右 的顺序进行遍历寻找。
  上:越界了  左:越界了  下:是 s ,与目标元素  b  不相同 右:是 b,符合要求,依葫芦画瓢找第二个元素
  上:越界了  左:是 a,与目标元素  f  不相同 下:是 f,与目标元素  f  相同,符合要求,依葫芦画瓢找第三个元素
  上:根据题目要求不需要考虑  左:是 s,与目标元素  c  不相同 下:是 d,与目标元素  c  不相同 右:是 c,与目标元素  c  相同,符合要求,依葫芦画瓢找第四个元素
  上:是 c,与目标元素  e  不相同 左:根据题目要求不需要考虑  下:是 e,与目标元素  e  相同,符合要求,寻找结束,匹配成功,返回 true 2、规律1、在搜索过程中,如果当前元素与目标元素 不匹配 ,则回退到之前的节点再搜索 2、在搜索过程中,如果当前元素与目标元素 相匹配 ,则按照上左下右 的方向进行再次搜索匹配剩下的元素 3、在搜索过程中,搜索 当前元素 的上左下右 方向的元素时,会出现重复访问之前元素 的情况,比如搜索匹配成功的第三个元素 c  的四个方向时,会重复访问一下 f 。
  为了保证不重复访问节点,可以将这条路径上 已经访问过的节点 ,修改为不在 word 当中的一个字符,保证以后再次访问时不会重复访问,这里我们将其修改为特殊字符 #  。
  修改完后会出现一种情况,当前的节点元素与目标元素相匹配,但是在它的四个方向的节点中都找不到可以匹配到目标下一元素的节点。
  比如此时当前元素  c  与目标元素 c  相匹配,但是目标下一元素为 x ,而在当前元素的四个方向上都找不到 x  ,需要把这个点回退,根据之前的操作,当前的节点被修改为了 # ,所以为了能够回退成功,再回退操作时需要重新将 #  修改回原来的元素。
  3、匹配
  本题提供了一个矩阵,矩阵是一个二维数组,需要我们在二维数组中进行搜索,为了能够覆盖所有的情况,必然要使用 两个嵌套的循环 。
  在搜索过程中,当遇到匹配成功的元素,搜索其下一元素的操作与当前的操作一致,即可以使用 递归 。 递归参数 :当前元素在矩阵 board  中的行列索引 i  和 j  ,当前目标字符在word  中的索引 k 。 终止条件 : 返回   false  :(1) 行或列索引越界(2) 当前矩阵元素与目标字符不同(3) 当前矩阵元素已访问过  返回   true  :  k = len(word) - 1  ,即字符串 word  已全部匹配。 递推工作 : 标记当前矩阵元素:将  board[ i ] [ j ]  修改为特殊字符 #  ,代表此元素已访问过,防止之后搜索时重复访问。 搜索下一节点:朝当前元素的  上、左、下、右  四个方向开启下层递归。 回退时还原当前矩阵元素:将  board[ i ] [ j ]  元素还原至初始值,即 word[k] 。 返回值:  返回布尔量 res  ,代表是否搜索到目标字符串。 4、边界1、行越界  2、列越界  3、矩阵元素已访问过  2、分析解法
  在看懂题目的前提下,分析解法就轻松多了, 在脑海中我们已经大概知道了题目想要考察的方向,接下来我们需要思考的是题目的逻辑是怎么样的,不需要考虑代码层面。
  需要注意的是,在第一遍或者第二遍解题时,不要过分追求所谓奇淫技巧的解法,很多同学错误的认为了奇淫技巧等于水平高超,我之前也出现过这个误解,很多 LeetCode 上的数学题都能一行或两行代码就 AC,每次自己写大半天发现答案竟然如此简单很是受挫。
  后来发现,这些奇淫技巧并不能提高自己的水平,除了发在评论区能引来别人一句卧槽的惊讶,从而带来一点内心虚荣心的满足以外,其余的用处不大。
  当然,等你刷个两三百到题目再回过头来重新思考,你会发现那些奇淫技巧的方法是如此的美妙。  3、代码实现
  看懂了题目,有了思路,其实这道题的 90% 你已经解决了,把它实现出来按理来说就是自然而然的事儿了。
  有时,将一个思路转换成算法是很容易且自然的;但有时,有些思路转换成代码,是很有难度的事情,这就是你写代码的能力问题,其实就是练少了。
  刷题说到底还是需要 题海战术 。 总结
  呼,总是写完了。
  希望今天的这六千字的经验分享能带给你一些思考:)
  原文链接:https://mp.weixin.qq.com/s/bNU1ULyE0AoE3RZFciWozg

字节跳动独立游戏发行品牌旗下的游戏在GooglePlay获奖了在12月份揭晓的GooglePlayBestof2021年度奖项中,拿下最佳创新游戏奖的有一款国产游戏Inked(洇客),很多人不知道该游戏由Pixmain发行。Pixmain字节三国杀女王界大虎上线?网友强度不重要,这台词我爱啦哈喽,大家好,我是阿柴。上次吐槽了三国杀移动版新的盒子将刘璋(强度不高,价格还不便宜),今天我们来聊聊这个盒子里面的另一个精品武将界孙鲁班。这个武将,相信很多小伙伴(lsp)都期待云顶刚送走变异大虫子,三名流卡莎就乘机上位,强度远超五费卡在云顶之弈12。4b版本的热补丁上线后,表现过于抢眼的变异战士因打破了游戏平衡,而受到了重点关照,三处削弱可以说是直戳要害。一是核心棋子大虫子的属性被削弱。生命值由1400降低至1世纪华通谢斐视自律为自然规律用未来的思维进军硬科技2021年,国内游戏行业迎来了一轮新的调整。世纪华通总裁盛趣游戏CEO谢斐在日前举行的2021中国游戏产业年会中用四个关键词总结了当下游戏行业面临的挑战与机遇,并提出了以内容为切入骁将三国金阙之巅玩法介绍,快速翻红全靠刷塔和竞猜跨服战斗,永远都是网络游戏最大的核心看点之一,能接触更广阔的江湖,才体会得到山外有山的新奇。作为一款融合了战略经营卡牌竞技和角色养成的创意手游,骁将三国自然也有着一套趣味的跨服战斗云顶之弈赛恩盾狙推荐阵容组成厄运小姐塞恩烬迦娜布隆奥莉安娜布里茨悠米羁绊组成1猫猫1巨像2精密发条2极客2保镖2白魔法师2圣盾使2学者2狙神海克斯抢装顺序防御性装备都给赛恩,物理装备给烬,法强装备给女英雄联盟手游MMR机制即将取代ELO机制!破局之法立刻奉上相信各位英雄联盟手游的玩家在排位中被ELO机制恶心的已经想要口吐芬芳了吧,其实前不久我们也出过ELO机制的破局之法。但是那毕竟不是什么正途。你想啊,为了下一局更好的上分,在劣势局鼓大新闻!Happy一血终交代皇帝被Soin吊打了特逗杯C组,胜者组决赛,TH地图,Happy迎战Soin。比赛开始不到三分钟的时间,Happy请求暂停,并表示自己需要3分钟的时间。7分钟后,欧皇归来,表达歉意的同时比赛继续开始。力拔山兮气盖世随机点数大师大娃领衔葫芦兄弟加入随机战场相信大家对葫芦兄弟这个经典IP并不陌生,这款由上海美术电影制片厂制作的国产动漫可以说是承载了一代人的儿时回忆,更是国产动漫史上不朽的经典,就算到了今天,当我们提起这部动漫的时候也依质疑Cryin就是质疑当年的我!Letme直言UP的双C真的很猛前言S11英雄联盟冬季转会期已经正式落下了帷幕,其中UP战队虽然失去了SMLZ等核心选手,但也引来了Cryin和旧梦这两位强力双C,整体来看实力还算比较不错的,为此,大家都非常期待王者荣耀官方比赛出现透视选手?摆烂玩出新高度,离了大谱众所周知,王者荣耀对于演员和外挂的打击力度是非常大的,一旦被确认有外挂嫌疑,那么直接是10年封禁套餐,毫不留情,但是总有人能以一些特殊方式转空子,而这次居然出现在虎牙举办的百家大战
LOLLPL全明星Solo赛圣枪哥灵性大头双杀Shanks亚索2021LPL全明星周末首日荣耀日正式到来!在年度颁奖盛典环节期间还进行了紧张激烈的全明星Solo赛,来自各大战队的实力选手通过1v1对决争夺最终的Solo冠军。第三场比赛由EDGDota2fy为何疯狂攻击各路选手?Maybe森哥不会放过任何人哈喽大家好,这里是蜻蜓队长Zwj。经常逛论坛的水友应该知道,在某站的各路Dota剪辑UP主中出现了一位被大家戏称为fy森哥本森的UP主,而在近日的直播中Maybe也是和水友们聊了一中国战队输了!打了场真正的王者荣耀世界赛,天美的尴尬藏不住了最近有个事儿,小范围火了一下AG战队的元老选手梦泪,带队出征王者荣耀世界赛,最终因为种种原因,铩羽而归。别笑,是真的世界赛。参赛队伍来自日本印度尼西亚泰国等各地区。比赛的游戏是ArRNG至臻全华班敲定!Bin导自己发布照片,大漏勺已经到基地了前言S11赛季的比赛已经全部结束了,相信绝大多数的玩家都关注了最近一段时间的转会期,各大战队的人员变动还是非常大的,随着截止时间逐渐临近,lpl赛区的一些顶尖强队的阵容也是渐渐曝光张大仙沉浸式解说,XYG创造奇迹晋级六强,DYG遗憾败北依稀记得在KPL秋季赛开赛前,很多解说都不看好XYG战队,认为他们晋级A组算是一件遥不可及的事情。可是XYG战队在KPL秋季赛中一路连跳,让玩家看到这支战队的恐怖之处。在本次KPL同样是摸鱼,为啥被抓的总是你?QCYG1拉你出坑你我皆凡人,上班都想摸摸鱼,手游也随着需求逐渐转为英雄联盟式的瞬间组队打完即散的模式,真是为时刻摸鱼创造了条件,摸鱼也不能凑活,对桌购置了游戏手机,弹跳器,甚至还买了耳罩游戏耳机,看完了今年的TGA,你还觉得它野鸡吗?不管怎么说,你总能在下面这4个老外的喜怒哀乐中找到刚看完TGA的自己。说实话,对于今年的TGA我兴趣并不大,如果说疫情对于游戏圈子一点影响都没有那肯定是假的,在过去的一年里,游戏跳宝可梦百代森林的可怕甜蜜传说,得到雄性结草儿是关键在四代的游戏中,当玩家第一次到百代森林的时候,会遇到携带着吉利蛋的宝可梦训练家芽米,在剧情上,她要么是担心会遇到银河队,要么是自己一个人不敢穿过森林,之后会和玩家组队同行,并且一路黑暗奇幻风RPG孤儿的工作收养孤儿为未来而战以黑暗奇幻为故事风格的回合制RPG游戏孤儿的工作,繁体中文版已经上线日系游戏平台Johren开放游玩了,游戏以认真细緻的世界观与精美的美术设计风靡日本,下面让我们一起来看看吧!故事虎年皮肤价格确定,杨玉环首款传说限定来袭,备好1430点券本期看点虎年皮肤价格确定,杨玉环首款传说限定来袭,备好1430点券!文资源君大家好,我是资源君,本期我们来聊一聊虎年的限定皮肤,以及其价格和上线时间,值得一提的是,在虎年限定皮肤中王者荣耀11月只有2款皮肤,评分很低!12月会有哪些皮肤上线?周年庆过去之后,王者就没有那么频繁地上线新皮肤了。盘点一下11月,发现除了新英雄金蝉的原皮和伴生,就只有两款皮肤。就像在今年2月上线了11款皮肤之后,三月就只有1款新皮肤。我们把它