前端面試(算法篇) - 二分法

前段時間換了份工做,也經歷了不少面試,最終一般都會撲在算法上前端

雖然說前端是全部程序員中,對於算法的要求最低的一個崗位,但算法依舊是進階的必修課程序員

因而決定記錄一下與算法相關的面試題,之後拿去面別人面試

 

1、面試題算法

問:有一個一百層的高樓,如今給你兩個徹底同樣的玻璃球,去測出在哪一層樓把球扔出去,恰好能把玻璃球砸碎?數組

答:emmmmmmspa

問:球碎了就無法用了code

答:那若是沒碎呢?blog

問:emmmmmm排序

答:啊哈,那就拿着球從一樓往上,一層一層的試唄~
遞歸

問:好,那如今不限制球的數量,但要求用最少的次數,去找到這個臨界點

答:二分法!從中間的樓層開始扔球,若是碎了就在下面的樓層中繼續找

問:沒錯,二分法是最快的解決方案,但若是遇到最差的狀況,須要用幾個球呢?

答:我數一數

問:……

答:……

問:算了,下一個問題吧

 

2、二分法

使用二分法的前提是,目標數組的元素必須是有序排列的,因此二分法屬於有序查找算法

二分法又稱爲「折半查找」,從數組的中間節點開始查找,將數組分爲兩部分

若是目標元素和中間節點不相等,就經過比較二者的大小,肯定接下來查找數組的前半部分仍是後半部分

而後遞歸查找,直到找到目標元素,或者發現目標元素不在數組內

在最壞的狀況下,須要的次數爲:(logn)+1 ,其中 log2n 向下取整

function BinarySearch(arr, target) { let s = 0; let e = arr.length - 1; let m = Math.floor((s + e) / 2); let trun = arr[s] <= arr[e]; //肯定排序順序

    while (s < e && arr[m] !== target) { if (arr[m] > target) { trun ? (e = m - 1) : (s = m + 1) } else { trun ? (s = m + 1) : (e = m - 1) } m = Math.floor((s + e) / 2); } if (arr[m] == target) { console.log('找到了,位置%s', m, t); return m; } else { console.log('沒找到', t); return -1; } }

 

3、問題拓展

1. 用二分法遇到最壞的狀況,須要 6 次 仍是 7 次?

2. 若是隻有兩個球,怎麼才能用最少的次數,找到臨界點?

相關文章
相關標籤/搜索