常見面試演算法題JS實現-設計一個有getMin功能的棧

来源:https://www.cnblogs.com/zllwebstudy/archive/2018/07/17/9324287.html
-Advertisement-
Play Games

前言: 已經確定工作了~下周一正式入職,按理說應該是可以好好浪蕩一周的,但是內心總是不安,總覺得自己這個水平真的太菜了,還是趁著現在有自己的時間,趕緊多看看書,多學習學習吧orz所以把之前校招買的書,又翻出來看,都是很經典的書,但是因為自己找到工作之後就放縱了,幾乎都放在書架上長灰,現在拿出來,一是 ...


前言:

  已經確定工作了~下周一正式入職,按理說應該是可以好好浪蕩一周的,但是內心總是不安,總覺得自己這個水平真的太菜了,還是趁著現在有自己的時間,趕緊多看看書,多學習學習吧orz所以把之前校招買的書,又翻出來看,都是很經典的書,但是因為自己找到工作之後就放縱了,幾乎都放在書架上長灰,現在拿出來,一是希望自己能夠養成一個學習的好習慣,即使在工作忙的時候,依然要擠出一點時間學習新的知識,不能得過且過,二是希望記錄一下正在努力時的自己,也算是跟想要偷懶時的自己說,“喂,懶鬼,快點學習,不然你就真的對不起曾經努力的自己和以後懊悔的自己了”,嗯呢,閑話又說多了,接下來就正式開始咯~

 

正文:

  【題目】實現一個特殊的棧,在實現棧的基本功能的基礎上,再實現返回棧中最小元素的操作。

  【要求】1. pop、push、getMin操作的時間複雜度都為O(1)

      2. 設計的棧類型可以使用現成的棧結構

  【思路】定義一個stackData和一個stackMin,stackData用於存放實際數據,stackMin用於存放stackData中的最小值。重寫pop和push方法,實現stackData和stackMin的數據同步。

  【實現】實現的方式有兩種,詳見代碼。

 // 方法一
1
class MyStack { 2 constructor() { 3 this.stackData = []; 4 this.stackMin = []; 5 } 6 push() { 7 let args = arguments[0]; 8 if (typeof args === 'number') { 9 //將新數據壓入stackData棧中 10 this.stackData.push(args); 11 //判斷是否將新數據壓入stackMin棧中 12 if (this.stackMin.length > 0) { 13 //stackMin棧不空,需要判斷當前數據是否小於等於stackMin的棧頂元素 14 let top = this.getMin(); 15 if (args <= top) { 16 this.stackMin.push(args); 17 } 18 } else { 19 //stackMin棧空,則壓入 20 this.stackMin.push(args); 21 } 22 } 23 } 24 pop() { 25 if (this.stackMin.length === 0) { 26 throw new Error('Stack is empty!'); 27 } 28 let p = this.stackData.pop(); 29 let top = this.getMin(); 30 if (p === top) { 31 this.stackMin.pop(); 32 } 33 return p; 34 } 35 getMin() { 36 if (this.stackMin.length === 0) { 37 throw new Error('Stack is empty!'); 38 } 39 let len = this.stackMin.length; 40 return this.stackMin[len - 1]; 41 } 42 } 43 44 let s = new MyStack(); 45 s.push(4); 46 s.push(2); 47 s.push(1); 48 console.log(s.getMin()); 49 s.pop(); 50 console.log(s.getMin()); 51 s.pop(); 52 s.pop(); 53 s.pop(); //拋出異常
 //方法二
1
class MyStack { 2 constructor() { 3 this.stackData = []; 4 this.stackMin = []; 5 } 6 push() { 7 let args = arguments[0]; 8 if (typeof args === 'number') { 9 //將新數據壓入stackData棧中 10 this.stackData.push(args); 11 //判斷是否將新數據壓入stackMin棧中 12 if (this.stackMin.length > 0) { 13 //stackMin棧不空,需要判斷當前數據是否小於等於stackMin的棧頂元素 14 let top = this.getMin(); 15 if (args <= top) { 16 this.stackMin.push(args); 17 } else { 18 this.stackMin.push(top); 19 } 20 } else { 21 //stackMin棧空,則壓入 22 this.stackMin.push(args); 23 } 24 } 25 } 26 pop() { 27 if (this.stackMin.length === 0) { 28 throw new Error('Stack is empty!'); 29 } 30 let p = this.stackData.pop(); 31 this.stackMin.pop(); 32 return p; 33 } 34 getMin() { 35 if (this.stackMin.length === 0) { 36 throw new Error('Stack is empty!'); 37 } 38 let len = this.stackMin.length; 39 return this.stackMin[len - 1]; 40 } 41 } 42 43 let s = new MyStack(); 44 s.push(4); 45 s.push(2); 46 s.push(1); 47 console.log(s.getMin()); 48 s.pop(); 49 console.log(s.getMin()); 50 s.pop(); 51 s.pop(); 52 // s.pop(); //拋出異常

 

後話:

  這個是計劃寫成一個系列,主要參考的就是左大神的《程式員代碼面試指南——IT名企演算法與數據結構題目最優解》,左大神在書里是用JAVA實現的,基本看得懂,但是因為我是用JS的,總覺得差點意思,反正也是學習,乾脆就自己實現JS的寫法,並且分享出來,也算是讓我繼續堅持的一個動力,當然,因為本人是菜鳥小白,肯定或多或少會出現一些問題,希望各位大牛們在嘲笑之餘能夠請不吝賜教~康桑阿米達~阿尼嘎多~Thx~謝謝~


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

-Advertisement-
Play Games
更多相關文章
  • 我們在工作中常常需要監聽某一個屬性值的變化,這個時候我們就需要用到了監聽屬性watch,在這裡我總結watch屬性的三種場景使用希望對你有所幫助: 1.基礎版監聽: 場景如下:輸入框輸入你的年齡,如果年齡在0 15歲提示信息:你還是個小孩,如果年齡在 15 25歲,提示信息:你已經是個少年,如果年齡 ...
  • 本人後端開發碼農一個,公司前端忙的一逼,項目使用的是easyui組件,其自帶的datebox組件使用起來非常不爽,主要表現在 1、自定義顯示格式很麻煩 2、選擇年份和月份用戶體驗也不好 網上有關於和My97DatePicker結合的例子,但感覺也用的不是很爽。 發現國內的layDate體驗非常滿意, ...
  • 1 2 3 4 5 Title 6 7 8 9 10 用戶名: 11 13 14 密&emsp;碼: 15 17 18 性&emsp;別: 19 ... ...
  • 一. html與Controller中的雙向數據綁定 html Controller的雙向數據綁定,在開發中非常常見,也是Angularjs1.x的宣傳點之一,使用中並沒有太多問題。 1.1數據從html流向controller 也就是從 視圖層 流向 模型層 ,原生html中需要使用表單元素(例如 ...
  • 一、變數 1.var關鍵字的弊端 var關鍵字的弊端:1.可以重覆聲明變數;2.無法限制變數修改;3.沒有會計作用域,只有函數作用域。 慣用的解決辦法是將onclick寫進一個匿名函數。 2.let和const關鍵字 let和const關鍵字使得變數不可以被重覆聲明,且變數具有塊級作用域。不同的是, ...
  • 遇到面試的一個編程題:三個返回promise對象的非同步操作,讓你寫一個函數可以將這些操作順序執行,並返回一個數組包含三個非同步對象的結果 非同步對象: 註意:promise對象在實例化的時候就會執行,所以函數都是返回promise對象,這樣執行函數的時候就會執行promise對象中的內容 我們期望的結果 ...
  • 1.官網 url:http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 文檔包含了表格屬性、列屬性、事件、方法等等. 2.引入庫 只要引入 jquery、bootstrap 、bootstrap-table的包,不用在js裡面定義就 ...
  • 一、緒論 說實話,真的不知道如何給這篇博客命名,因為我覺得應該有一些小伙伴遇到跟我同樣的問題正在抓耳撓腮中。 二、導火索 最近在做一個移動H5翻頁的功能,類似於MAKA模板那種。假設大致框架如下 ​ 第一頁是首頁,第二頁開始就是要動態添加的地方,所以紅框裡面的樣式類,是從2開始的,這是第一個伏筆。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...