内容干货很多,关于我我的没接触过的笔试方案以及一些优化小技巧,请耐心读完。面试
这是一家美国公司,国内有分支机构,其机构负责人目前在国外,因此最后面试就变成了微信视频面试……
我这段时间因为上家公司的问题,如今不想工做,就想好好的写写文章,旅旅游,因此几乎任何面试邀请,我都用“暂无打算,谢谢”给回绝了,惟独这一家,我接受了面试邀请,而且愿意谈谈。说来惭愧,本质上,我可能并不可能去上班,由于上述缘由……算法
接受的缘由也很简单,公司title和技术人员介绍。公司title上面说了,再也不重复;技术人员介绍是“核心技术人员包括CTO都是硅谷出身,近一半以上目前分布在硅谷与芝加哥。”。这就让我来兴趣了,原本是电话打来讲是拉勾看到,我已经拒绝,而后提到这里,嗯哼,面面看,看看大牛究竟如何。这里,约好次日下午2点去杭州机构面试。数组
而后晚上人事微信通知我,因为机构总裁还在芝加哥,因此但愿可以视频面试,机构总裁也是技术出身。我固然答应了,而后约好次日上午9点半微信视频面试。浏览器
重点来了!!!微信
原计划写一写关于面试经历的,发现写着写着太多,就独立一篇文章出去,关于小公司的,地址: 很是重要,小公司面试防坑指南
以前面试都是电面,面对面面,啥啥啥的。可是,咱们除了基础知识的掌握程度外,难道代码风格与质量就不重要了吗?优化
难道代码不能说明事情,非要搞这些杂七杂八的小项,耗费你个人精力?要知道上公司去面试,对于面试者来讲,是很费时费精力的一件事情。要不,大家怎么不到我家里来面试呢?网站
我很喜欢某博客下的小标题:_代码改变世界。_spa
是的,是骡子是马,拉出来溜溜,啥都别说了,上代码,哥让你三行。code
我觉得是电面,人事微信告诉我,使用http://collabedit.com/这个网站直接Code级别面试,就是实时撸代码给对方看效果。视频
讲真,她告诉我这个后,我也是一脸懵逼,这究竟什么玩意儿,没这么弄过啊。紧张,不安的情绪接踵而至,事实上我并没必要紧张,由于原本就不怎么打算去,可是遇到新鲜事物 ,老是好奇和恐惧。
而后点进去看了以后,大概明白怎么回事了,当我选择好JavaScript以后,空白的输入框等着我,右方有用户与聊天,我大概完全清楚怎么玩了,以下图:
刚刚只是知道是实时撸代码,如今清楚怎么回事了。
下面就是问题,我撸啥?具体人事也不知道,后来就没有消息,我估计实例建立、排序算法、实际问题解答,无外乎就这样了吧。
实际视频面试
到了次日上午9点半,如约与其总裁微信视频,年龄不大,很亲切,也颇有礼貌。废话很少说,观点一致,直接代码见高下。
没有实例建立,没有排序算法演示,就是提出一个问题,问题也是代码,以下:
//汇率转换 6.25 list // 卖(高)- 买(低) const arr = [6.78, 6.4326, 6.3458, 6.3424, 6.2893, 6.432, 6.3494, 6.6239, 6.5633, 6.5533]
???啥子呦。
一番讲解,需求:
这是十天的某货币与人民币的兑换比例,如何算出最大收益。
呵呵,小看我,三秒钟哥给你……口头答复。不就是个排序嘛,把数组按照从小到大排序,而后手上金额乘以最后一个而后减去手上金额乘以第一个就是结果咯。
代码以下:
//汇率转换 6.25 list // 卖(高)- 买(低) const arr = [6.78, 6.4326, 6.3458, 6.3424, 6.2893, 6.432, 6.3494, 6.6239, 6.5633, 6.5533] const money = 100 // 人民币 let getMax = function(array) { let length = array.length for(let i = 0; i < array.length; i++) { for(let j = i + 1; j < length; j++) { let itemI = array[i] let itemJ = array[j] if(itemI > itemJ) { let all = itemI + itemJ itemI = all - itemJ itemJ = all - itemI } } return array } console.log(money * array[array.length - 1] - money * array[0])
因而兴致勃勃的说:“应该就这样吧。”
对方看了看,微笑道:“你这是个排序,可是有业务上的问题啊。”
我说:“什么问题啊,最大减最小而后更手上金额的乘积,就是最大利润啊。”
他说:“说是这么说,可是这是相似股票交易,确定是后一天的……”
这里我打断道:“哦哦哦,对对对,这东西有个T+1和T+2什么鬼的,就是必须是后面的天卖出高价,前面的天买进低价才行。”
对面说:“对的,你要不要再看看。”
我:“恩, 我想一想这个业务啊,没接触过,稍等下。”
他:“不要紧,你慢慢想,我这边主要是看你的思路和解决方案,不着急。”
大约30秒后,我想到方案了,没说话,直接开搞,代码以下:
//汇率转换 6.25 list // 卖(高)- 买(低) const arr = [6.78, 6.4326, 6.3458, 6.3424, 6.2893, 6.432, 6.3494, 6.6239, 6.5633, 6.5533] const money = 100 // 人民币 // 分析 /* 小值以前的大值都是无效的 */ let getMax = function(array) { let length = array.length let results = [] // 用来储存后面大于前面的全部差值的集合 for(let i = 0; i < array.length; i++) { for(let j = i + 1; j < length; j++) { let itemI = array[i] let itemJ = array[j] if(ItemJ - itemI > 0) results.push(itemJ - itemI) } // 拿到全部,后面减前面的结果 return results } console.log(money * (Math.max(...results)))
嘴里一直在嘀咕每一步,这是正常的。
他看了看说:“恩,结果对了,这边使用到了排序,这个复杂度是多少?”
我不假思索:“O(n^2)”
他说:“能不能优化?”
我说:“能够,并归排序能够优化到O(nlgn),可是并归排序须要递归,我不是很熟,须要点时间。”
他说:“nlgn是对的,可是这个暂时不用了,咱们看看Code,能不能优化了。”
我:“刚刚在实现业务,代码固然能够优化了,我看看,等下啊。”
一会会儿后,优化后代码以下:
//汇率转换 6.25 list // 卖(高)- 买(低) const arr = [6.78, 6.4326, 6.3458, 6.3424, 6.2893, 6.432, 6.3494, 6.6239, 6.5633, 6.5533] const money = 100 // 人民币 let getMax // 提早声明 // 分析 /* 小值以前的大值都是无效的 */ //let getMax = function(array) { getMax = function(array) { let length = array.length let results = [] for(let i = 0, k = length - 1; i < k; i++) { // 减小取值次数,不用遍历最后一个,这是又一次优化 // for(let i = 0, k = length; i < k; i++) { // 减小取值次数 // for(let i = 0; i < array.length; i++) { let itemI = array[i] // 不用每次都从新取值 for(let j = i + 1; j < length; j++) { // let itemI = array[i] let itemJ = array[j] let a = itemJ - itemI if(a > 0) results.push(a) // 减小一些计算 // if(ItemJ - itemI > 0) results.push(itemJ - itemI) } // 拿到全部,后面减前面的结果 return results } console.log(money * (Math.max(...results)))
弄完后,他说:“results的存在我知道意义,可是这个须要存在吗?或者说,最后的Math.max(...results)遍历须要吗?”
我这里脑子宕机,没反应过来:“额,把全部存在的盈利差都取到,而后最后获取最大的那个,没毛病啊,这里我暂时想不到有什么优化点了啊。除了float浮点计算外。”
他提示到:“float这个咱们无论他这里。上面那个问题,若是有个max变量来接,每次双层遍历的时候比对一下,是否是能够解决?”
我瞬间明白意思,赶忙改了,最终代码以下:
//汇率转换 6.25 list // 卖(高)- 买(低) const arr = [6.78, 6.4326, 6.3458, 6.3424, 6.2893, 6.432, 6.3494, 6.6239, 6.5633, 6.5533] const money = 100 // 人民币 let getMax // 分析 /* 小值以前的大值都是无效的 */ getMax = function(array) { let length = array.length let max = 0 // 对比保存最大值便可 for(let i = 0, k = length - 1; i < k; i++) { let itemI = array[i] for(let j = i + 1; j < length; j++) { let itemJ = array[j] let a = itemJ - itemI if(a > max) max = a // 这里每次都对比一下就行 } // 拿到全部,后面减前面的结果 return max } console.log(getMax(arr) * money)
这里有个小tip:若是是大数,好比上十亿甚至更多,数学上这个遍历复杂度就再也不紧要,由于无论浏览器采用的是并归仍是快速,要么是nlgn要么是n^2,可是上面已存在一个nlogn或者n^2,假设就是n^2,那么顶多就是2n^2的复杂度,忽略掉常数项,复杂度依然是n^2。可是其实是有价值的,好比你n^2须要10天,那么两倍就是20天。。。没差异是指数学上,数学上。。。
其余过程再也不赘述,结果就是他们React我用Vue,不匹配,我拒绝换用React,实际上就是我不想工做。。。
我我的很承认这种方式,除非他是吹牛,不然我认为这种方式绝对是可取的,公司能够放不少考题或者实际业务题来让面试的人回答,面试者能够在家里,在网吧处理,而面试官也能够在公司或者家里的电脑上评分,真实,有效。比问那些网上一大堆答案的面试题有用多了。
初级的工程师可以解决问题,高级的工程师能够用巧妙的方法更快速的解决问题。你厉害,你值钱;你会,他不会,你就比他更值钱。
若是文章对你有任何帮助,我就很是开心了。我是风蓝小栖,按期更新技术文章,若是喜欢个人文章,请关注一下,谢谢!