都說今年是互聯網的寒冬,因爲我的緣由想要換個地方工做,因此在某boss上投遞了簡歷,當天就收到諸多boss的消息,讓我發送簡歷,其中就包括我想去的宇宙條。宇宙條的效率是真的很高,收到簡歷後沒多久就打電話過來約面試時間,因爲本人是異地,故只能接受電話/視頻面試。很快肯定了面試時間和方式,宇宙條的面試可安排在週末,由此即可知道其「加班定律」。我面試的崗位是web前端開發工程師崗,座標北京。前端
自我介紹,基本上這是開啓激戰的導火索。順便一提,宇宙條的視頻面試是在牛客網上,可進行編碼,視頻,語音,文字溝通。面試官能夠實時看到應聘者當前頁面的內容和操做。node
1.display的取值和各類值的區別?web
2.相鄰的兩個inline-block節點爲何會出現間隔,該如何解決?面試
3.用過nodejs中的EventEmitter嗎?詳細講講。算法
4.前端性能優化有哪些?數組
5.講簡歷中提到的一個項目,而且講解服務端渲染和前端渲染的優缺點?爲何你的項目會選擇服務端渲染?性能優化
6.講講CSRF。bash
7.ts和js的區別,爲何要選擇使用ts?前端性能
找出數組中和爲給定值的兩個元素,如:[1, 2, 3, 4, 5]中找出和爲6的兩個元素。性能
題目很清晰,也很容易理解,相信不少小夥伴看到這個題都能直觀地用「冒泡排序」的方法解決,可是冒泡排序的時間複雜度明顯不是咱們想要的結果,我把我可以想到的幾種方法由易到難記錄下來:
冒泡排序的方式
function getNum(arr, sum) {
if (!Array.isArray(arr)) return null;
for (var i = 0; i < arr.length - 1; i++) {
if (arr[i] > sum) continue;
for (var j = 0; j < arr.length; j++) {
if (arr[j] > sum) continue;
if (arr[i] + arr[j] == sum) return [arr[i], arr[j]];
}
}
return null;
}
複製代碼
這種解法很容易想到,也很容易理解,咱們很少過多的講解,接下來分享一種上述解法的優化版。
查找的方式
最終的結果是要找到和爲sum的兩個數,那麼咱們能夠轉換一種思路:默認第一個num1數已經存在,那麼第二個數就是sum - num1,這就轉換爲從數組中查找的問題了。雖然和第一種方法很像,可是在有序數列中進行查找明顯要快於逐個比較。
function getNum(arr, sum) {
if (!Array.isArray(arr)) return null;
arr.sort();
for (var i = 0; i < arr.length - 1; i++) {
if (arr[i] > sum) continue;
var restNum = sum - arr[i];
// 考慮下爲何要 > i
if (arr.indexOf(restNum) > i) return [arr[i], restNum];
}
return null;
}
複製代碼
這種解法的前提是須要對數組進行排序(快排),故時間複雜度爲O(nlogn),二分查找的時間複雜度爲O(log2n),最壞的狀況是遍歷了整個數組,即時間複雜度爲O(n),那麼總體的時間複雜度爲O(nlog2n),效果上要優於冒泡排序的方式。
快排方式
一樣須要對數組進行排序(升序),咱們知道排序後的數組必然是左邊的數不會超過右邊的數,所以咱們能夠把左邊的數和右邊的數的和做爲基準值來和目標值比較,若是該值小於目標值,那麼表明兩個加數的值不夠大,右邊的值已經到達頂峯了,那麼就從左邊取下一個值相加和目標值比較,若是該值比目標值大,那麼表示右邊的值太大了,須要獲取一個小一點的加數,這時須要從右邊取倒數第二個數相加後比較,若是此時的值和目標值相等,恭喜你,個人小乖乖,原來你倆在這裏!說了這麼多感受仍是一頭霧水的同窗直接看代碼吧,畢竟咱們都是同一類猿:-)
function getNum(arr, sum) {
if (!Array.isArray(arr)) return null;
arr.sort();
for (var i = 0, j = arr.length - 1; i < j;) {
if (arr[i] + arr[j] < sum) i++;
else if (arr[i] + arr[j] > sum) j--;
else return [arr[i], arr[j]];
}
return null;
}
複製代碼
這種方法我是受到了快速排序的啓發,因此命名爲快速排序的方式,它是目前爲止我能想到效率最高的解決方案,時間複雜度爲O(nlogn)。若是需求是找出全部對組合,只要控制退出條件便可,難度不大故不作討論。
首先說下最終的結果吧,跪了!不得不說宇宙條的效率很高,從簡歷採集到最終出結果全程能夠和HR進行交流,面試前夕也會電話確認,面試結束後會有一個面試評價,好像是每輪面試都有,網上匿名填寫,面試的結果在當天或是1-2個工做日會經過郵件的形式發送給你。
再說說本身吧,面試以前就沒有備足功課,一方面,當前的工做強度較大,每天加班的前提下抽出時間去學習是件奢侈的事情,只能在工做中邊作事情邊積累。另外一方面,本身以前面試結果都很滿意,因此有點飄了。致使此次面試自我介紹都有點結結巴巴,後面的問題也是很難用語言準確表達出來,提到這裏我我的感受面試官仍是很和善的,看到個人處境說寫出來就能夠了。
基礎題看上去都很簡單,因此我就沒有寫答案,有興趣的小夥伴能夠留言你本身的答案。本人雖然是計算機專業可是算法一直不算是個人強項,本次面試最讓我傷心的就是算法題,面試完成後一直都在考慮具體的解法,在時間的發酵下總算有了一點點收貨,仍是值得慶幸的事情。
接下來一段時間仍是要系統地總結和學習,不論是不是爲了面試,既然選擇了這一行就應該努力充實本身,等本身變得足夠強的時候,天然是別人承認你的時候!最後也預祝和我同樣想要換工做的小夥伴都能收到心儀公司的offer:-)。