解决技术面试题的五步法

     第一步:提问

            技术面试题看似清晰明确实则模糊不清,因此务必多提问题以澄清所有存疑之处。问到最后,你可能会发现,这个问题与你最初预想的截然不同——也许更难,也许更简单。实际上,许多面试官(尤其是微软的)会特意考察你 能否提出好问题。

       好问题大概是这样的:数据类型是什么?有多少数据?解决这个问题需要什么假定条件?用户都是谁?

       示例:“设计一种列表排序算法。”

  • 问题:具体是哪种列表?数组还是链表?

            回答:数组。

  • 问题:数组里存放的是什么?数字、字符、还是字符串?

        回答:数字。

  • 问题:这些数字都是整数吗?

        回答:是的。

  • 问题:这些数字来自何处?是身份证号码还是别的什么数值?

        回答:顾客年龄。

  • 问题:总共有多少顾客?

        回答:大概一百万。

        现在我们要解决一个与最初理解很不一样的问题:对一个包含一百万个整数的数组进行排序,这些整数在0到130(一个合理的最高年龄)之间。该怎么解决这个问题呢?只需要创建一个包含130个元素的数组,然后计算每一个元素出现的次数。

     第二步:设计算法

       算法的设计可能会很难,不过下一节的“算法题的五种解法”可以帮上大忙。在设计算法时,记得问问自己以下几个问题:

       该算法的空间和时间复杂度如何?

       碰到大量数据会怎么样?

       你的设计会引发其它问题吗?例如,你设计了一种二叉查找树的变体,那么该设计是否会影响插入、查找或删除时间?

       如果面试官指定特定数据(例如,前面提到待处理数据是年龄值,或按一定顺序排列的),你能否善用该信息?面试官给你特定信息往往是有原因的。

       你给出蛮力解法,这么做当然是允许的,甚至推荐这么做。然后,在此基础上不断优化。很显然,面试官总是期望你能给出尽可能最优的解法,但这并不意味着一开始就得给出完美无瑕的答案。

     第三步:编写伪码

       先写伪码有助于你理清思路,减少犯错的次数。不过,务必先跟面试官打声招呼,你会先写伪码,紧接着就会编写“真实的”代码。许多求职者选择写伪码,意在“逃避”编写真实代码,你肯定不愿与那些求职者为伍。

     第四步:编写代码

       编写代码不要太仓促;实际上,太仓促很可能会害了自己。写代码时只管放松步调,做到有条不紊,丝丝入扣。另外,切记以下忠告。

       多用数据结构:根据实际情况选用合适的数据结构,或者自己定义数据结构。例如,有个面试题涉及从一群人中找出年龄最小的,不妨考虑定义一个数据结构Person表示一个人。这样也能展现你注重良好的面向对象设计。

       写代码不要太杂乱:这看似小事一桩,实则很重要。在白板上写代码时,尽量从左上角而不是中间开始写。这样才有足够的地方从容答题。

     第五步:测试

  • 没错,自己写的代码自己测试!考虑测试以下用例。
  • 极端用例:0、负数、空值(null)、最大值、最小值。
  • 用户错误:用户传入空值或负数会出现什么问题?
  • 一般用例:测试正常用例。

       如果你的算法很复杂或涉及大量数值操作(移位、算术运算等),建议编写代码边测试,而不是写完代码再测试。

       发现错误时(这是难免的),务必先弄清楚出现缺陷的原因再作修改。你肯定不希望自己在面试官看了像热锅上的蚂蚁一样团团乱转,这里修修那里补补。举个例子,我就碰到过这样的求职者,他发现函数碰到某个特定值返回true而非正确的false,于是直接修改返回值,接着验证函数能否工作。这或许可以修改那种特定情况下出现的问题,但无疑又会滋生新的问题。

       当你觉察代码中存在的问题时,务必三思而后改,先理清代码失效的原因。这样你才能写出既漂亮又整洁的代码,也会越写越快。


                                                                ——摘自《程序员面试金典(第5版)》   




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值