記錄一次跨國筆試通過

內容乾貨很多,關於我我的沒接觸過的筆試方案以及一些優化小技巧,請耐心讀完。面試

原由

這是一家美國公司,國內有分支機構,其機構負責人目前在國外,因此最後面試就變成了微信視頻面試……

我這段時間因爲上家公司的問題,如今不想工做,就想好好的寫寫文章,旅旅遊,因此幾乎任何面試邀請,我都用「暫無打算,謝謝」給回絕了,惟獨這一家,我接受了面試邀請,而且願意談談。說來慚愧,本質上,我可能並不可能去上班,由於上述緣由……算法

接受的緣由也很簡單,公司title和技術人員介紹。公司title上面說了,再也不重複;技術人員介紹是「核心技術人員包括CTO都是硅谷出身,近一半以上目前分佈在硅谷與芝加哥。」。這就讓我來興趣了,原本是電話打來講是拉勾看到,我已經拒絕,而後提到這裏,嗯哼,面面看,看看大牛究竟如何。這裏,約好次日下午2點去杭州機構面試。數組

而後晚上人事微信通知我,因爲機構總裁還在芝加哥,因此但願可以視頻面試,機構總裁也是技術出身。我固然答應了,而後約好次日上午9點半微信視頻面試。瀏覽器

重點來了!!!微信

原計劃寫一寫關於面試經歷的,發現寫着寫着太多,就獨立一篇文章出去,關於小公司的,地址: 很是重要,小公司面試防坑指南

筆試方案

以前面試都是電面,面對面面,啥啥啥的。可是,咱們除了基礎知識的掌握程度外,難道代碼風格與質量就不重要了嗎?優化

難道代碼不能說明事情,非要搞這些雜七雜八的小項,耗費你個人精力?要知道上公司去面試,對於面試者來講,是很費時費精力的一件事情。要不,大家怎麼不到我家裏來面試呢?網站

我很喜歡某博客下的小標題:_代碼改變世界。_spa

是的,是騾子是馬,拉出來溜溜,啥都別說了,上代碼,哥讓你三行。code

  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. 優化這個問題始終都是問題

    初級的工程師可以解決問題,高級的工程師能夠用巧妙的方法更快速的解決問題。你厲害,你值錢;你會,他不會,你就比他更值錢。



若是文章對你有任何幫助,我就很是開心了。

我是風藍小棲,按期更新技術文章,若是喜歡個人文章,請關注一下,謝謝!

相關文章
相關標籤/搜索