前段時間換了份工做,也經歷了不少面試,最終一般都會撲在算法上前端
雖然說前端是全部程序員中,對於算法的要求最低的一個崗位,但算法依舊是進階的必修課程序員
因而決定記錄一下與算法相關的面試題,之後拿去面別人面試
1、面試題算法
問:有一個一百層的高樓,如今給你兩個徹底同樣的玻璃球,去測出在哪一層樓把球扔出去,恰好能把玻璃球砸碎?數組
答:emmmmmmspa
問:球碎了就無法用了code
答:那若是沒碎呢?blog
問:emmmmmm排序
答:啊哈,那就拿着球從一樓往上,一層一層的試唄~
遞歸
問:好,那如今不限制球的數量,但要求用最少的次數,去找到這個臨界點
答:二分法!從中間的樓層開始扔球,若是碎了就在下面的樓層中繼續找
問:沒錯,二分法是最快的解決方案,但若是遇到最差的狀況,須要用幾個球呢?
答:我數一數
問:……
答:……
問:算了,下一個問題吧
2、二分法
使用二分法的前提是,目標數組的元素必須是有序排列的,因此二分法屬於有序查找算法
二分法又稱爲「折半查找」,從數組的中間節點開始查找,將數組分爲兩部分
若是目標元素和中間節點不相等,就經過比較二者的大小,肯定接下來查找數組的前半部分仍是後半部分
而後遞歸查找,直到找到目標元素,或者發現目標元素不在數組內
在最壞的狀況下,須要的次數爲:(log2 n)+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. 若是隻有兩個球,怎麼才能用最少的次數,找到臨界點?