记录一次跨国笔试经过

2018-07-13 admin

内容干货不少,关于我个人没接触过的笔试方案以及一些优化小技巧,请耐心读完。

起因

这是一家美国公司,国内有分支机构,其机构负责人目前在国外,所以最后面试就变成了微信视频面试……

我这段时间由于上家公司的问题,现在不想工作,就想好好的写写文章,旅旅游,所以几乎任何面试邀请,我都用“暂无打算,谢谢”给回绝了,唯独这一家,我接受了面试邀请,并且愿意谈谈。说来惭愧,本质上,我可能并不可能去上班,因为上述原因……

接受的原因也很简单,公司title和技术人员介绍。公司title上面说了,不再重复;技术人员介绍是“核心技术人员包括CTO都是硅谷出身,近一半以上目前分布在硅谷与芝加哥。”。这就让我来兴趣了,本来是电话打来说是拉勾看到,我已经拒绝,然后提到这里,嗯哼,面面看,看看大牛究竟如何。这里,约好第二天下午2点去杭州机构面试。

然后晚上人事微信通知我,由于机构总裁还在芝加哥,所以希望能够视频面试,机构总裁也是技术出身。我当然答应了,然后约好第二天上午9点半微信视频面试。

重点来了!!!

原计划写一写关于面试经历的,发现写着写着太多,就独立一篇文章出去,关于小公司的,地址:非常重要,小公司面试防坑指南

笔试方案

之前面试都是电面,面对面面,啥啥啥的。但是,我们除了基础知识的掌握程度外,难道代码风格与质量就不重要了吗?

难道代码不能说明事情,非要搞这些杂七杂八的小项,耗费你我的精力?要知道上公司去面试,对于面试者来说,是很费时费精力的一件事情。要不,你们怎么不到我家里来面试呢?

我很喜欢某博客下的小标题:代码改变世界。

是的,是骡子是马,拉出来溜溜,啥都别说了,上代码,哥让你三行。

  1. 前期人事

    我以为是电面,人事微信告诉我,使用http://collabedit.com/这个网站直接Code级别面试,就是实时撸代码给对方看效果。

    讲真,她告诉我这个后,我也是一脸懵逼,这究竟什么玩意儿,没这么弄过啊。紧张,不安的情绪接踵而至,事实上我并不必紧张,因为本来就不怎么打算去,但是遇到新鲜事物 ,总是好奇和恐惧。

    然后点进去看了之后,大概明白怎么回事了,当我选择好JavaScript之后,空白的输入框等着我,右方有用户与聊天,我大概彻底清楚怎么玩了,如下图:

    图片描述

    刚刚只是知道是实时撸代码,现在清楚怎么回事了。

    下面就是问题,我撸啥?具体人事也不知道,后来就没有消息,我估计实例创建、排序算法、实际问题解答,无外乎就这样了吧。

  2. 实际视频面试

    到了第二天上午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,实际上就是我不想工作。。。


总结

  1. 据他说,硅谷那一块现在面试基本都是这种Online Coding方式,基本可以短时间内断定对方水平

    我个人很认可这种方式,除非他是吹牛,否则我认为这种方式绝对是可取的,公司可以放很多考题或者实际业务题来让面试的人回答,面试者可以在家里,在网吧处理,而面试官也可以在公司或者家里的电脑上评分,真实,有效。比问那些网上一大堆答案的面试题有用多了。

  2. 优化这个问题始终都是问题

    初级的工程师能够解决问题,高级的工程师可以用巧妙的方法更快速的解决问题。你厉害,你值钱;你会,他不会,你就比他更值钱。



如果文章对你有任何帮助,我就非常开心了。

我是风蓝小栖,定期更新技术文章,如果喜欢我的文章,请关注一下,谢谢!

原文链接:https://segmentfault.com/a/1190000015626945

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-35940.html

文章标题:记录一次跨国笔试经过

相关文章
在vue项目中的axios使用配置记录
默认vue项目中已经安装axios,基于element-ui开发,主要记录配置的相关。 axiosConfig.js import Vue from &#x27;vue&#x27; import axios from &#x27;axi...
2018-03-04
记一次基于mpvue的小程序开发及上线实战
经过为期两个晚上下班时间的努力,终于把我第一个小程序开发完成并发布上线了。整个过程还算顺利,由于使用了mpvue方案进行开发,故可以享受和vue一致的流畅开发体验;后台系统使用了python3+flask框架进行,使用最少的代码完成了小程序...
2018-04-21
vue打包后空白页问题全记录 (background路径,css js404,jsonp等);
总结一下vue打包后问题全记录: 大部分开发者webpack基本上都是拿来就用的(并没有系统化的研究)。 一 &gt;&gt;&gt; 打包之后的静态文件不能直接访问:(例如dist)打包后搭个服务器才能访问的! 选择cd 到dist存放发...
2018-02-08
记一次使用 vue-admin-template 的优化历程
本文原文 前言 公司有好几个项目都有后台管理系统,为了方便开发,所以选择了 vue 中比较火的 后台模板 作为基础模板进行开发。但是,开始用的时候,作者并没有对此进行优化,到项目上线的时候,才发现,打包出来的文件都十分之大,就一个 vend...
2018-05-17
TypeScript 2.7 记录
针对ts 2.7版本的特性作专门的实例,希望能加深理解。实例github地址 官方日志文档 增加常量声明的属性的支持(Constant-named properties) 对于常量,有更加智能的提示 const Foo = &quot;...
2018-05-18
记一次:iframe嵌套网页,利用window.postMessage()实现子父窗口相互传值
场景需要: http://a.com -父页面,记做A http://b.com -子页面,记做B B生成的DOM,获取DOM的属性,传到A A监听事件,获取监听的属性,传到B 利用window.postMessage() 方法可以安全地实...
2018-04-23
记一次bug经历-document.title
身为一个前端打字员,一直没有写博客的习惯,但是,今儿是忍不了了,且为自个儿今后提个醒。 最近用vue全家桶开发了一个网站,眼看一切都顺顺利利的,马上都要领盒饭了,突然发现一个bug,当我点击其他的标签页再点击回来的时候,神奇的事情发生了,网...
2018-05-08
详解webpack多页面配置记录
之前也写过webpack学习记录,项目中需要一个常用的webpack多页面配置,所以才动手,本着能写一行是一行的原则,开始了配置webpack之旅。 定目录结构 首先我只需要开发环境(包含自动更新)和打包环境,初定的目录结构是这样的 ap...
2018-01-26
微信H5记录视频播放进度
需求: 微信端看视频,关闭微信的窗口时需要记录当前播放时间,下次在进入的时候从上次保存的进度开始播放 面临的问题: 监控微信离开页面 重新进入时候从上传保存的地方播放 设备环境:Iphone 6s 微信 处理: 监控离开 开始的时候...
2018-04-25
记录Vue+elementUi的开发过程,小白一枚
最近公司在用Vue+elementUi开发后台管理系统,因为新手,所以好多东西理解的不够透彻,上手野也慢,现在自己给自己做下开发的小记录,方便日后查看和纠错,欢迎大家指正。 一.简单封装el-dialog组件,方便父组件调用 dialog组...
2018-03-20
回到顶部