新农上路
- 积分
- 99
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-2-14
- 最后登录
- 1970-1-1
|
注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
【楼主背景】国内211(非985)本科,国内工作3年,在拿到巨硬offer前算法只会冒泡排序和TwoSum级别。
【注】这是本人经验贴,如有大神发现不严谨地方,希望共同讨论。写经验回馈地里,也算是自己阶段性胜利的标志。
【问1】这种水平,只会冒泡排序,算法刷多久可以到巨硬、亚马逊?
【答曰】这个问题因素很多,
- 首先,典型来讲至少熟练掌握常见算法(暴力、动归、贪心、回溯)和数据结构(栈、图、树)脱手而出,而且要理解为什么要用这些方法?在什么情况下会用到这些方法?
- 其次,逻辑能力,这个属于辅助能力,清晰的逻辑能力能帮你“快速”、“快速”、“快速”地抓住问题的核心,解法的线路。如果逻辑能力不好,典型特征就是很难提炼题目内容,看了解答抓不清楚主次。这个东西如果说专门培养,可以找逻辑类的课程来提高,但是时间所限,就全心全意投入刷题,题感到了,也能达到相同效果。
- 然后,刷题时间,每天至少能持续贡献2小时。楼主每天都是早上6:30~8:30,晚上8:30~9:30刷题,花了8个月时间,中间有间断。在职确实很辛苦,没办法,nopain nogain。
【问2】蠡口刷多少题?
【答曰】这不应该是刷题的目标,也不应该是算法能力的评价标准。我们刷算法的目标应该是对题型分门别类,对症(题型、约束)下药(思路、方法),做到药到病除的效果。这与数量无关,与质量(对题目的理解剖析)有关。可以说做过的中等题5秒钟思路闪现,5~10分钟编码bugfree。如果非要说个数字,前300是基础,300~500属于提升。
【问3】蠡口该怎么刷?直接看答案还是自己先想再看答案,还是说其他呢?
【答曰】刷题方法应该服务于不同的算法认知状态,我给出几个典型状态以及我的方法,仅仅是个参考:
- 状态1,无知态,会用C++/php/java等写if...else,while,递归。做简单题,Math类和String类,此类题型比较单纯,可以先自己思考,再看答案。往往就是问题、子问题的形式,重在形成自己的思考方式。
- 状态2,懵懂态,给出一道Math和String的简单题,暴力法有思路。此时继续做简单题,熟悉常见算法(暴力、动归、贪心、回溯)和数据结构(栈、图、树)。这种问题也可以先自己思考,写出暴力解,然后看看人家如何进行优化的。如果说你想不出来暴力解(30分钟还没思路),没关系,直接找本类型的典型例题,度娘或谷歌有很多,看懂后再下手。俗称,先把别人的学到手,再看自己怎么办。重在形成自己的思考方式。
- 状态3,入门态,对基本提醒套路有所了解,但是缺乏大量的练习,此时你要做的就是,stop,stop,stop。把你做过的所有简单题,天天看,至少看5遍,达到做过的题思路1秒浮现,2分钟代码bugfree。
- 状态4,爬升态,在状态3之后,开始做中等难度的题,可以选择按分类,也可以不按分类,看个人心情。此时你会发现,中等题也就是简单题的思路叠加,但是有些题好难想到,为什么?因为缺乏训练,所以也把这个阶段称为爬升期。
- 状态5,中等态,在状态4的基础上,把你做过所有的中等题,天天看,至少看5遍,达到做过的题思路10秒浮现,10分钟代码bugfree。
- 状态>5,我还在进行中,无法评价。
【问4】为什么有时候很看重bugfree呢?
【答曰】这意味着你的逻辑思维,推理是完整的,自圆其说的,对基本算法概念有清晰的认知(数据分类,边界条件)。雇主想找的是一个能够思考较为完善的员工,如果出现边界问题,代码质量可见“一般”。这里强调,不是说一遍写完没有bug,是说你提交给面试官时最好别有bug。
【问5】我应该只追求最优解么?
【答曰】一定是no,克努斯说过,暴力解没思考清楚,别搞什么优化解答。我认为正确地姿势应该如下:
- 如果你能直接一眼看透题,就有“优化解”的感觉,好了,直接去做吧。
- 如果不能,先想想这个题的暴力解,然后逐渐优化到最优解,然后看看其他人是怎么写的最优解。推荐大家看看windliang和liweiwei1419的答案解析,比较完整的从0到1再到100的过程。
- 有些情况下,最优解反而很碍手,比如kmp或者数学公式这种东西,记忆成本很重,真正理解很花费时间,建议这种接法直接过,性价比太低。
【问6】别人出offer了,只刷了200道题,别人会用5种方法,自己为什么1种也不会?
【答曰】心态一定要平稳、平稳、平稳。不知道就学,不要钻进牛角尖,”为什么为什么“出不来
【问7】你认为算法有什么思维套路么?
【答曰】这算是我的核武器了,不喜勿喷。
- 大问题划分为子问题。例如,问maximum subarray,那这个问题可以分解为求以每个元素为终点的子序列最大值。
- 分类讨论,分步进行。例如,问maximum subarray,首先,问题可以分解为求以每个元素为终点的子序列最大值;然后累加和分为负数和0(我不需要的),正数(我需要的);遇到当前<=0舍弃,>0时比较大小。我写的很糙,只是想告诉大家有这么个思想在里面。
【问8】靠前好焦虑,刷了300道题,不知道怎么复习?
【答曰】没做到大事(300)化小(题型分类),小(题型分类)事化了(思维模式),不了(思维模式)了之(训练的自信)的状态。多总结,多归纳!!
【问9】巨硬是怎么面的算法?
【答曰】我清晰记得,某一面算法,我真的不知道怎么做,当时就优点慌。无奈只能先写暴力解。然后面试官提示你看看哪里重复运算,我说可以优化那里。面试官又问,怎么样可以做到再次减少运算,你看xxxx,我说你可以优化那里。每个“那里”都是刷题时自己静下心来体会到的门道。面试官更看重二人合作,共创美好家园,而不会因为你写了暴力解或者直接最优解就对你一概而论。
如果觉着有帮助,还请能赏些米,造饭吃~~冬天又冷又饿,北漂蚁族真难。。。。
|
上一篇: 【干货】FLAG面了200+的面试官告诉你算法面试不是只有刷题这么简单下一篇: restful api 和 http request的区别
|