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

来源:https://www.cnblogs.com/wisewrong/archive/2018/08/15/9482835.html
-Advertisement-
Play Games

前段時間換了份工作,也經歷了很多面試,最終通常都會撲在演算法上 雖說前端是所有程式員中,對於演算法的要求最低的一個崗位,但演算法依舊是進階的必修課 於是決定記錄一下與演算法相關的面試題,以後拿去面別人 一、面試題 問:有一個一百層的高樓,現在給你兩個完全一樣的玻璃球,去測出在哪一層樓把球扔出去,剛好能把玻璃 ...


前段時間換了份工作,也經歷了很多面試,最終通常都會撲在演算法上

雖說前端是所有程式員中,對於演算法的要求最低的一個崗位,但演算法依舊是進階的必修課

於是決定記錄一下與演算法相關的面試題,以後拿去面別人

 

一、面試題

問:有一個一百層的高樓,現在給你兩個完全一樣的玻璃球,去測出在哪一層樓把球扔出去,剛好能把玻璃球砸碎?

答:emmmmmm

問:球碎了就沒法用了

答:那如果沒碎呢?

問:emmmmmm

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

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

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

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

答:我數一數

問:……

答:……

問:算了,下一個問題吧

 

二、二分法

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

二分法又稱為“折半查找”,從數組的中間節點開始查找,將數組分為兩部分

如果目標元素和中間節點不相等,就通過比較兩者的大小,確定接下來查找數組的前半部分還是後半部分

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

在最壞的情況下,需要的次數為:(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;
    }
}

 

三、問題拓展

1. 用二分法遇到最壞的情況,需要 6 次 還是 7 次?

2. 如果只有兩個球,怎麼才能用最少的次數,找到臨界點?

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Google Play 不能直接下載apk安裝包,解決辦法,安裝插件下載 第一步 FQ就不說了 第二步 安裝google瀏覽器 APK Downloader插件 第三步 打開Google play網站,找到要下載的APP,點擊進入詳情頁面。點擊插件,複製鏈接進去,即可下載apk安裝包 ...
  • 區別:null是一個表示無的對象,轉換為數值為0; undefined表示一個無的原始值,轉化為數值為NAN(與任何數字相加也為NAN) undefined出現原因:(口訣:一變數二函數一對象) 1.變數被聲明瞭但是沒賦值時 2.調用函數時,應該提供的參數沒提供,則該參數為undefined 3.函 ...
  • 1 . Math.ceil() 向上取整 2. Math.floor() 向下取整 3. Math.round() 四捨五入取整 4. Math.random() 生成隨機數 生成n - m 的隨機整數 parseInt(n + Math.random()*(m-n+1)); parseInt是強制 ...
  • 經過 "《字元串的擴展》" 和 "《字元編碼的那些事》" 這兩篇文章的閱讀,大概瞭解js里codePointAt方法返回結果的含義。 那麼這個134071到底是這麼來的呢?我們可以根據這段話來理解。 在http://tool.chinaz.com/tools/unicode.aspx這個網站上可以將 ...
  • 經過測試,鬧心律師小程式第二期也即將上線了,而鬧心對於小程式有怎麼樣的開發實踐呢? 小程式在千呼萬喚出來之後,帶來了大量的開發的吐槽,但儘管我們再怎麼嫌棄小程式語法,我們也無法否認微信給小程式所帶來的流量以及收益,也必須看重小程式,也不得不去學習小程式 那麼我們開發小程式應該怎麼去開發呢,熟悉前端的 ...
  • $.map(data,function(item,index){return XXX}) 遍歷data數組中的每個元素,並按照return中的計算方式 形成一個新的元素,放入返回的數組中 輸出為 55 0 [55,1,2]是一個數組,按照return的條件,,,,function 中的item,為5 ...
  • 1 2 3 4 5 Title 6 73 74 75 76 77 78 請註冊 79 立即登陸&gt; 80 81 82 83 84 ... ...
  • 塊級元素:獨占一行,其寬度自動填滿父元素的寬度,可以容納行內元素和其他塊級元素,可以設置margin和padding值。 行內元素:不會獨占一行,與其他行內元素排成一行,直到其父元素拍不下,才會從新一行開始。可以容納文本及其他行內元素,設置padding和margin值無效,行內元素的水平方向的pa ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...