(给ImportNew加星标,提高Java花样) [好文分享:www.ii77.com]
作者:码农唐磊 [本文来自:www.ii77.com]
求职面试在绝大部门人来说都是必弗成少的,本身作为求职者也介入了不少面试(无论成功或许失败),作为手艺面试官介入面试也有四五年的经验,在面试过程中也见识到了各类各样的人(有厉害的,也有奇葩的)。在这里也只想谈谈本身的一些见解,我说的纷歧定对,有分歧的定见能够留言介入商议。
面试正本就是一个双向选择的过程,面试官和候选人的地位本应该是一个平等的位置,面试官进展经由简洁的交流沟通能够对候选人的手艺,沟通等有必然认识进而确定候选人是否成家响应的地位。小我认为一场成功的面试最好是可以让求职者和面试官都有必然的收获(曾经也碰到过在某次面试后,HR 敷陈我有候选人特意跟她反馈要表达对面试官的感激,因为让他很有收获,这当然照样让我感应非常愉快的),每次介入面试,也进展本身能达到这个方针。对于候选人来说能从面试过程认识本身的不足或许交流商量面试问题;对于面试官来说能认识候选人的手艺和项目,在交流商量中也是一次进修和巩固。 此外面试可否经由最终强调的是地位成家,一个萝卜一个坑,萝卜太大或太小都纷歧定合适。所以有时候面试没经由并不是候选人不敷精良,也有或者是候选人过于精良(例如正本只想雇用 P6,究竟来了一个 P8的候选人一定错误适)。因为面试时间有限,1个小时(一样情形)的时间很难去周全认识候选人的手艺实力,是以在面试过程中很难做到绝对的平正。举个简洁的例子,面试官出一道问题,候选人 A 或者曾经做过或见过,所以可以对照轻松地回覆出这个问题,而候选人 B 没有做过,固然不克答出让面试官写意的谜底,但 B 供应了一些解题的思路,固然最终并没有答出这道问题,这就必然解说候选人 B 比 A 差么? 并不是吧。下面就从这道问题说起,这道问题是我在过往的面试中经常考查的一道问题。实现一个函数,完成 开根号 的把持,方式签名如下:
double sqrt(int v, double t)
- 不克挪用系统库函数,诸如 Math.sqrt(v) 之类的;
- 假设较量出的究竟为 r,要求知足这个前提: ,个中 是真实的值, t 为给定的一个误差局限,例如0.1等,即你较量出的值要在给定的误差局限内。
- 实现说话不限,你前提能够比上述加倍苛刻,但不克宽松。例如挪用你的接口 sqrt(9, 0.21) 返回值属于 [2.79, 3.21] 这个区间的随意一个都知足前提。
看到这里,其实你能够 拿出笔和纸,测验解答一下,需要注重的是谜底要知足给定的误差前提,迎接沟通交流。其实这个问题是就是 leetcode 上原题稍加转变获得,做过的一定感觉 leetcode 其他问题来说相对对照简洁。但没做过也没紧要,若是在面试官的提醒下可以最终把这道问题解出来,在我看来也 OK 的,甚至有或者比刷过题记住解题谜底的更好(当然刷过问题自己的一定会环绕这个问题穿插其他小问题的)。其实刚起头,我认为这道问题对照简洁,至少在赐与提醒后,幻想情形下大部门一线coding的法式员都能够给出实实在在 code 的。然而“幻想很丰满,实际很骨感”,事实并非如斯,然而在面试很好多人之后, 发现此道问题并不简洁,若是你能写出来,解说你已经比好多人精良了(至少在我过往的社招面试履历中)。 问题给出后,我一样首先明确候选人弄清楚了问题的寄义然后会给一两分钟让候选人先思虑一下。或者候选人心里OS是: “你出如许的问题是不是有病啊,明明有 lib 函数能够直接用的”。(之前同组有其他小伙伴的确有碰到如许的候选人,说话虽没如许夸张,大意是:实际工作中会显现如许的问题吗? 我直接给你百度一个就行了)在此强调,面试这道问题并不是想强调这个问题自己,盼望以这道问题为契机,考查候选人在剖析问题息争决问题的能力,在交流过程中所施展的逻辑推理和脑筋体式等,当然最后也会看看实实在在的 Code,从编码过程中看候选人的编程习惯,气势等等。也有候选人刚起头抱着谁人约束误差局限的不等式研究 N 久,然后没有然后了的。刚起头看这个前提当然好,但若是这个不等式没有思路能够先放一放,没需要在那吃力熬。面试官:如许吧,若是我问题 根号10 等于几多?你怎么回覆?
面试官:你怎么知道是3 点几,因为你知道9开根号是3,想象一下,你也能够完全用法式帮助模拟你大脑思虑的过程。其实这里是进展提醒候选人,我们首先是要解题,然后才考虑效率。即不管用什么方式可以给出一个谜底的,这个时候候选人或者进入下一个阶段了。在实际工作场景中其实也是一般,碰到一个问题,首先我们要想到的是若何解决这个实际问题,有了最根蒂的解决方案之后再谈优化。先用一个轮回找到 r,使得 r^2 是离给定 v 比来的平方数,即你进展算根号10 ,先找到3,因为3^2=9 。然后再用一个轮回, 每次 r+=t ,直到 r^2 > v 为止。面试官:这个方式从理论上讲, 是一个可行的方案,设想一下,若是我的精度要求很高,进展较量的 v 也很大,如 sqrt(v = 10000000, t = 0.000001) 之类的,挪用你这个方式效率是不是很低,这个时候应该怎么优化?
求职者:如许的话,我这个方式效率的确对照低,不外能够如许优化,好比设置一个步长,一次迭代后,若是没有达到预期,能够络续点窜这个步长来增大切近真实值的速度,好比10倍误差,100倍误差等。其实,在与候选人的络续交流中能够看出候选人的 Problem Solving 的能力,这也是面试考查中的一点。例如关于上面问题的优化,也或者用于在实际工作中碰到的问题。例如,我们在实际工作中或者经常会写一些异步的回调通知接口等,这个接口或者是其他团队维护的,有或者因为收集问题等回调接口或者会失败进而需要重试,对于重试的机制其实就能够借鉴上面的“步长”机制,第一次回调失败, 我守候 1s 后重试,失败再重试,或许距离 1s 不太得当,是否能够点窜守候的步长,守候好比 5s,10s?等等再重试直到成功。为什么要如许做? 或许对方 server 正本如今就处于峰值,你一直的重试不只没有增加你接口挪用成功的机会,反而增加对方 server 的肩负。面试官:恩,如许做的确能够优化。但从素质上讲,假设我们不考虑误差的话,这个问题其实就是在一个有序的列内外面去搜刮知足前提的特定的值。方才你的方式是一个线性的搜刮方案。常见的搜刮还有其他什么吗?面试官:对呀,你能够测验想想可否借用一下这个思路来解决这个问题。当然,部门候选人提醒二分后,就直接可以 get 到点,而且可以写出二分大体框架,但或者竣事前提写的有点问题。面试官:如许懂得吧,你方才的搜刮整数部门的过程其实是线性的,一个一个数去暴力穷举。借助二分的意思就是,好比算 根号10,你搜刮局限是 [0, 10] (其实除了几个数之外局限能够更小[0, v/2],你能证实么?)。- 因为5^2 = 25 > 10 , 所以 r 属于[0, 5)
- 因为(5/2) ^2 = 6.25 < 10 , 所以 r 属于 (2.5, 5)
- 因为(3.75^2 = 14.0625 > 10) ,所以 r 属于 (2.5, 3.75)
一个二分查找,算法思路都连系例子讲一遍了,在候选人回覆领略的情形下,幻想傍边,作为一线斥地者写出来应该不成问题吧。然而…幻想和实际照样有差距的。好多人都喜欢用递归写,可是好多人递归里面的最主要的竣事前提都木有, 一些界限前提等等都木有。所以一样情形下,代码写完后,我会让候选人本身写测试用例。面试官:写好了是吧,你写几个测试用例吧,假设这个接口是别人写的,你应该从哪几个角度去测试。
求职者:sqrt(-4, 0.21),哎呀,我这里忘了判断了。改一下代码。
求职者:sqrt(0, 0.21),sqrt(4, 0.21)… 还有问题,再改改。为什么要别人提醒要测试用例,才去 check 本身写的代码的准确性呢。有的候选人写的代码,就不拿一些非常情形去 check,就用上面讲的 sqrt(10, 0.21) 的例子都得不到预期究竟。可以达到这一个步伐的人已经较少了,若是你有较全测试用例和界限前提的判断,再加上后背的竣事前提可以准确,根基上这道问题就算写意了。素质上讲,这个算法就是一个迭代切近的过程,用二分的思路后,要害就在于什么时候竣事。 问题中已经给了误差前提 ,难点在于个中的不知道,不太轻易直接进行较量判断。不少人用一个此外的竣事前提来进行了判断即: ,其实这两个前提是纷歧样的。对于这个竣事前提,你有什么见解吗? 能证实你的设法吗?当然本题还有一些其他的数学解法,例如用牛顿迭代法,梯度下降法(最速下降法),泰勒公式睁开等等。若是候选人能想到这些,解说他照样有必然数学根蒂的,若是甘愿能够让他讲讲。(考查这道问题本意并不是盼望候选人用这些数学方式解的。)对于这道问题,你有什么对照好的思路吗? 迎接留言介入商议。- 问:为什么问题中的 v 的类型是 int?
答:还真没有来由,double 也无所谓,或者仅仅是因为 leetcode 上原题较量的数是 int 吧。
- 问:我能准确答对这道问题就必然能经由此次面试吗?
答:强调一下,面试中考查如许一个问题,并不是仅仅考查这道问题自己,不是说你将这道题做对了,就能经由面试,反之也不是说你没做对这道问题就必然不克经由我们的面试。我们经由这道问题为契机,进展考查的是候选人在剖析问题解决问题的能力,在交流过程中所施展的逻辑推理和脑筋体式等,当然也有最后实实在在的 code。
- 问:这不是一道数学问题吗,为什么法式员面试需要考查如许的数学问题?
答:同上,不是考查这道问题自己。此外,这也能够说不是一道数学问题,当然能用数学的体式解答。候选人能用数学的体式解答也算准确。
- 问:二分是这道问题的尺度谜底吗?我能用其他解法吗?
答:同上,问题没有尺度谜底,就算你用最暴力的算法搜刮出来也是准确的解法,其他数学方式也对。
- 问:这道问题这么简洁,牛顿迭代分分钟秒掉,是不是太简洁了?
答: 给你点赞。
- 问:这问题在说什么,我搞了半天没看懂,这TM是啥?
答:若是的确卖力看完整篇文章或跟面试官交流了那么久,照样基本不领略这究竟说的是一个什么问题。那就别管了吧,随他去吧,或者不是方针用户罢了。
- 问:我在实际工作中基本就不会碰到如许的问题,你问这个有什么用?
答:同第2条谜底。
- 问:你们公司还缺人么,面试会考查哪些点?
答:有乐趣或许有其他问题能够戳我邮箱,邮箱地址:aUB0YW5nbGVpLm1l。 面试考查或者会涉及:CS 根蒂/Code/数据构造和算法/解决问题/项目经验/系统设计/沟通团队协作等等。
本文问题是“从一道面试题谈谈一线大厂码农应该具备的根基能力”,其实,上面大部门内容只谈到了这道问题自己(也穿插了一些对这道问题的剖析和懂得)。上述问题的场景是社招面试中的,对于如许的问题来说校招的反馈会更好。因为在校生或者对于工作经验,项目经验等对照欠缺,所以只好用一些对照固定的算法来面试进行筛选(素质上跟学校测验没有太大的区别)。 但这种雷同的问题在社招场景下就完全不适用吗?社招的的同窗写不出来就有很充裕的来由吗?或许你在工作场景中不会碰到实际这种问题,但我其实想表达的是,作为在最前方写代码的码农,在别人讲解了二分算法且本身也能懂得的情形下,能写出这个二分算法应该不算太难?相当于一个需求,人人商议了算法实现息争法,需要你把它酿成能跑的 code 罢了。其实这篇文章最起头叫“从一道面试题谈谈一线码农应该具备的根基能力”,几年前发出来被喷了,后来想想似乎被喷也有点事理,因为在平常有些场景下,“复制粘贴”工程师貌似也够用了,碰到问题有更高水平的人来帮你解决就行,人人都一般的话,怎么施展高手水平呢?但从用人单元单子角度想,当然是更进展雇用加倍精良的选手,如何施展精良呢?候选人基数太大,怎么筛选,其实也就“高考”一般嘛,经由“测验”择优登科罢了。我们就不去商议是否每个写代码的人都需要有如许的能力(似乎谜底也是显而易见并不是)。但我建议咱们一线的法式员们(特指有长进心的一线法式员)应该对一些根基的数据构造和算法有所认识,对常见的算法复杂度有所认识? 或许至少应该有如许的追求吧?好比二分搜刮复杂度为什么是 。之前碰到过好比有的候选人,Java 斥地七八年经验了,简历描述精晓 Java,但不清楚 ArrayList, HashMap 内部也许是怎么做的(我懂得,不管什么都需要知道大略的实现道理才有或者去优化碰到的各类机能问题吧?)。还有什么熟练把握 Vim,究竟其实就是熟练把握若何打开和封闭 vim。还有的候选生齿头表达头头是道,究竟落实到写代码就基本下不了笔。有时候感受大部门法式员都被大量的需求榨取着,被产物司理催促着,急急地码着繁琐的买卖代码,络续的改着 Bug 又引入新的 Bug。 买卖代码主要么,当然主要(代码就是办事于具体买卖的),但同时也照样进展我们不要甩掉一些根蒂的器材,多培育一下我们的编程素养。我们在用编程说话,行使各类对象来实现我们想要达到的目的的时候,能做到“知其然,知其所以然”岂不更好?分享大厂分布式独一ID设计方案,快来围观
Java内存模型之可见性(填坑之路)
【商议】:缓存同步、若何包管缓存一致性、缓存误用
看完本文有收获?请转发分享给更多人
存眷「ImportNew」,提拔Java花样
好文章,我在看❤️