摘要:實際視頻面試到了第二天上午點半,如約與其總裁微信視頻,年齡不大,很親切,也很有禮貌。一番講解,需求這是十天的某貨幣與人民幣的兌換比例,如何算出最大收益。
內容干貨不少,關于我個人沒接觸過的筆試方案以及一些優化小技巧,請耐心讀完。
起因這是一家美國公司,國內有分支機構,其機構負責人目前在國外,所以最后面試就變成了微信視頻面試……
我這段時間由于上家公司的問題,現在不想工作,就想好好的寫寫文章,旅旅游,所以幾乎任何面試邀請,我都用“暫無打算,謝謝”給回絕了,唯獨這一家,我接受了面試邀請,并且愿意談談。說來慚愧,本質上,我可能并不可能去上班,因為上述原因……
接受的原因也很簡單,公司title和技術人員介紹。公司title上面說了,不再重復;技術人員介紹是“核心技術人員包括CTO都是硅谷出身,近一半以上目前分布在硅谷與芝加哥。”。這就讓我來興趣了,本來是電話打來說是拉勾看到,我已經拒絕,然后提到這里,嗯哼,面面看,看看大牛究竟如何。這里,約好第二天下午2點去杭州機構面試。
然后晚上人事微信通知我,由于機構總裁還在芝加哥,所以希望能夠視頻面試,機構總裁也是技術出身。我當然答應了,然后約好第二天上午9點半微信視頻面試。
重點來了!!!
原計劃寫一寫關于面試經歷的,發現寫著寫著太多,就獨立一篇文章出去,關于小公司的,地址:非常重要,小公司面試防坑指南筆試方案
之前面試都是電面,面對面面,啥啥啥的。但是,我們除了基礎知識的掌握程度外,難道代碼風格與質量就不重要了嗎?
難道代碼不能說明事情,非要搞這些雜七雜八的小項,耗費你我的精力?要知道上公司去面試,對于面試者來說,是很費時費精力的一件事情。要不,你們怎么不到我家里來面試呢?
我很喜歡某博客下的小標題:_代碼改變世界。_
是的,是騾子是馬,拉出來溜溜,啥都別說了,上代碼,哥讓你三行。
前期人事
我以為是電面,人事微信告訴我,使用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,實際上就是我不想工作。。。總結
據他說,硅谷那一塊現在面試基本都是這種Online Coding方式,基本可以短時間內斷定對方水平
我個人很認可這種方式,除非他是吹牛,否則我認為這種方式絕對是可取的,公司可以放很多考題或者實際業務題來讓面試的人回答,面試者可以在家里,在網吧處理,而面試官也可以在公司或者家里的電腦上評分,真實,有效。比問那些網上一大堆答案的面試題有用多了。
優化這個問題始終都是問題
初級的工程師能夠解決問題,高級的工程師可以用巧妙的方法更快速的解決問題。你厲害,你值錢;你會,他不會,你就比他更值錢。
如果文章對你有任何幫助,我就非常開心了。我是風藍小棲,定期更新技術文章,如果喜歡我的文章,請關注一下,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/96103.html
摘要:春招結果五月份了,春招已經接近尾聲,因為到了周五晚上剛好有空,所以簡單地記錄一下自己的春招過程。我的春招從二月初一直持續到四月底,截止今天,已經斬獲唯品會電商前端研發部大數據與威脅分析事業部京東精銳暑假實習生的騰訊的是早上打過來的。 春招結果 五月份了,春招已經接近尾聲,因為到了周五晚上剛好有空,所以簡單地記錄一下自己的春招過程。我的春招從二月初一直持續到四月底,截止今天,已經斬獲唯品...
摘要:不過很快就開始著手做了,我提交了兩次代碼給面試官看,第一次是著重隨機座位算法的實現,可是后來經過提醒其實是側重于架構知識方面的。于是又改了一次答案,提交了。嗯感覺算是過了筆試吧,起碼收到面試官面試的邀請了。 怎么說呢,感覺還是很神奇啊。。。 我是在某直聘上面投遞了簡歷,投遞之后不久一個tx-hr跟我聯系,簡單溝通之后,就說幫我內推。我想這波可以啊。 下午就收到了技術面試官的短信,加...
摘要:不過很快就開始著手做了,我提交了兩次代碼給面試官看,第一次是著重隨機座位算法的實現,可是后來經過提醒其實是側重于架構知識方面的。于是又改了一次答案,提交了。嗯感覺算是過了筆試吧,起碼收到面試官面試的邀請了。 怎么說呢,感覺還是很神奇啊。。。 我是在某直聘上面投遞了簡歷,投遞之后不久一個tx-hr跟我聯系,簡單溝通之后,就說幫我內推。我想這波可以啊。 下午就收到了技術面試官的短信,加...
閱讀 3290·2021-09-09 11:39
閱讀 1237·2021-09-09 09:33
閱讀 1139·2019-08-30 15:43
閱讀 555·2019-08-29 14:08
閱讀 1741·2019-08-26 13:49
閱讀 2386·2019-08-26 10:09
閱讀 1553·2019-08-23 17:13
閱讀 2291·2019-08-23 12:57