从一道面试题谈起,大厂到底看重程序员的什么能力? ...
唐磊,他谦逊的自我介绍,是“在阿里云打工的清华学渣”。上周的一篇《字符串比较,居然暗藏玄机》,我最早是在唐磊《这10行比较字符串相等的代码给我整懵了》里看到的,我用通俗的语言,展开了“密码破解”案例。文末却没有提引用的出处,这里和唐磊道个歉。看了唐磊的其他一些文章,源于一线,深入细节,不禁想起了4-5年前提笔写技术文字的自己。希望他的好文被更多热爱技术的小伙伴看到,这里转一篇唐磊的好文。文章:《从一道面试题谈起,大厂到底看重程序员的什么能力?》这是我在面试过程中,经常问的一道题。一起看看,一起动笔试试吧。实现一个函数,完成开根号的操作:double sqrt(int v, double t)要求:(1)不能调用系统库函数,例如 Math.sqrt(v);(2)假设计算出的结果为 r,要求满足这个条件:,其中是真实的值, t 为给定的一个误差范围,例如0.1等,即你计算出的值要在给定的误差范围内; 分析问题和解决问题的能力,以及在交流过程中,所体现的理解能力,逻辑能力和思维方式,当然,也会从 Code 中考察候选人的编程习惯与编程风格。此时,我会引导候选人:先解决,再优化。在实际工作场景也一样,先思考解决问题的方法,再考虑优化。暴力搜索法面试过程中,很多人能回答到这一步:先用一个循环找到 r,使得 r^2 是离给定 v 最近的平方数,即你希望算根号10 ,先找到3,因为3^2=9 。然后再用一个循环, 每次 r+=t ,直到 r^2 > v 为止。 t = 0.000001) 之类的,效率不会很低么?理解能力,与解决问题的能力,这本身也是面试过程中的一部分。二分搜索法提示二分,大部分候选人就能够写出二分框架,只是结束条件仍有疑惑,我会继续举例提醒他: 10]:[/i,[list,
[*, 5) [/i,
[*,[i,因为(5/2) ^2 = 6.25 < 10 , 所以 r 属于 (2.5, 5) [/i,
[*,[i,因为(3.75^2 = 14.0625 > 10) ,所以 r 属于 (2.5, 3.75) [/i,
[*,[i,...[/i,
关于结束条件本质上讲,这个算法就是一个迭代逼近的过程,用二分的思路后,关键就在于什么时候结束。 题目中已经给了误差条件,难点在于其中的不知道,不太方便直接进行计算判断。不少人用一个另外的结束条件来进行了判断即:,额,这一样吗?其他解法当然本题还有一些其他的数学解法,例如用牛顿迭代法,梯度下降法,泰勒公式展开等等。如果候选人能想到这些,说明他还是有一定数学基础的,可以让他讲讲。结语其实,上面大部分内容只谈到了这道题目本身,也穿插了一些对这道题目的分析和理解,这样的题目考察校招的同学会比较合适。但类似的题目,社招完全不适用吗?社招的的同学,写不出来就有很充分的理由吗?或许你在工作场景中不会遇到实际这种题目,但我其实想表达的是,作为一线的工程师,在面试官讲解了二分算法,并且自己也能理解的情况下,写出相关的 Code ,真的很过分吗?在日常有些场景下,“复制粘贴”工程师貌似也够用,遇到问题,叫更高水平的人来帮你,这样的话,你的核心竞争力在哪里?我建议一线的程序员们,应该对基本的数据结构和算法有所了解,对常见的算法复杂度有所了解。这样的要求,不高吧。之前遇到过一些候选人,Java 开发七八年经验了,却不清楚 ArrayList, HashMap 内部是怎么做的。还有些候选人,口头表达头头是道,结果落实到写代码就根本下不了笔。希望我们不要抛弃一些基础的东西,多培养一下我们的编程素养,在用编程语言,利用各种工具来实现我们想要达到的目的的时候,能做到“知其然,知其所以然”。==全文完==程序猿石头希望大家有收获,欢迎扫码,关注这个“在阿里云打工的清华学渣”。 太棒了!! 你好棒!! 赞!赞!! 你历害!! 沙发!! 支持!!! 转发了!! 牛逼!! 非常好!!
页:
[1]
2