亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

用PHP解決的一個棧的面試題

 更新時間:2014年07月02日 11:39:23   投稿:junjie  
這篇文章主要介紹了用PHP解決的一個棧的面試題,準(zhǔn)備面試的高端PHP程序員可以看看,需要的朋友可以參考下

前言

遇到一道面試題,題目大概意思如下:

使用兩個普通棧實現(xiàn)一個特殊棧,使得pop、push、min三個函數(shù)的都是復(fù)雜度為O(1)的操作,min函數(shù)是獲得當(dāng)前棧的最小值。

初步想法

1.要實現(xiàn)min函數(shù)為(1)操作,當(dāng)時第一想法是事先需要算好當(dāng)前最小值,于是會想到用一個值來保存當(dāng)前棧中最小值元素,然后push和pop操作的時候維護這個值。這樣min,push都是O(1)了,但pop可不是,如果當(dāng)前彈出的是最小值,需要從新尋找當(dāng)前元素的最小值,這個就不是o(1)了。

2.而且上面方法沒有用到另外一個棧,于是又想到:在一個棧中存儲排好序的元素,同樣在push和pop操作中維護這個有序堆棧,如圖:

但是這樣的話min操作是O(1),但是push、pop操作因為要維護這個有序棧,怎么也想不到一個方法可以O(shè)(1)的復(fù)雜度。

當(dāng)時覺得肯定是在另一個棧中緩存最小值信息,但是不知道是因為沒吃飯還是怎么地,思維就此僵住了。

正確解法

遇到問題解決不了,感覺心里很不爽,于是吃飯的時候又開始想怎么充分理由棧的特性,有效的緩存最小值信息,以便min操作使用。

棧操作最大的特性是只能操作棧頂元素,想到那用一個輔助棧緩存每次棧操作時的最小值,不是剛剛好。這樣每次pop操作的時候,兩邊一起彈出就可以;因為輔助棧的棧頂元素最當(dāng)前棧中的最小值,push操作是也只需要比較入棧元素和輔助棧棧頂元素就可以。這樣push、pop、min都都O(1)操作了。如圖:

文字可能沒說清楚,上代碼,下面是PHP的實現(xiàn),通過數(shù)組來模擬堆棧。

<?php
/**
 * 使用一個輔助棧,O(1)復(fù)雜度求出棧中的最小數(shù)
 * @hack 類中通過數(shù)組來模擬堆棧
 * 
 * @author laiwenhui
 */
class strack{

  /**
   * 數(shù)據(jù)棧,存儲棧數(shù)據(jù);
   *
   * @var array
   */
  private $_arrData = array();
  /**
   * 輔助棧,存儲數(shù)據(jù)組棧中每層的最下值信息;
   *
   * @var array
   */
  private $_arrMin = array();
  /**
   * 棧頂所在單元
   *
   * @var int
   */
  private $_top=-1;
  /**
   * 出棧
   * @return bool|int
   */
  public function pop(){
    if ($this->_top === -1){
      return false;
    }
    array_pop($this->_arrMin);
    $this->_top--;
    return array_pop($this->_arrData);
  }
  /**
   * 入棧
   * @param int $element
   * @return bool
   */
  public function push($element){
    $element = intval($element);
    //如果棧為空,直接入棧
    if ($this->_top === -1){
      array_push($this->_arrData, $element);
      array_push($this->_arrMin, $element);
      $this->_top++;
      return true;
    }
    //不為空,判斷入棧的值是否比最小棧棧頂小
    $min = $this->_arrMin[$this->_top];
    //比較求出最小值
    $currentMin = $element < $min ? $element : $min;
    //當(dāng)前棧中最小值入棧
    array_push($this->_arrMin, $currentMin);
    //數(shù)據(jù)入棧
    array_push($this->_arrData, $element);
    $this->_top++;

    return true;
  }
  /**
   * 求當(dāng)前??臻g的最小值
   * @return bool|int 
   */
  public function min(){
    if ($this->_top === -1){
      return false;
    }
    return $this->_arrMin[$this->_top];
  }
}

使用如下:

復(fù)制代碼 代碼如下:

$obj = new strack();
$obj->push(12);
$obj->push(56);
$obj->push(23);
$obj->push(89);
$obj->push(4);
var_dump($obj->min());
$obj->pop();
var_dump($obj->min());
$obj->push(8);
var_dump($obj->min());

輸出為:

復(fù)制代碼 代碼如下:

int(4)
int(12)
int(8)

OK,滿足要求。

你是否有其他更好方法實現(xiàn),如果有,請告訴我^_^

相關(guān)文章

  • 詳解關(guān)于php的xdebug配置(編輯器vscode)

    詳解關(guān)于php的xdebug配置(編輯器vscode)

    這篇文章主要介紹了詳解關(guān)于php的xdebug配置(編輯器vscode),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 深入php函數(shù)file_get_contents超時處理的方法詳解

    深入php函數(shù)file_get_contents超時處理的方法詳解

    本篇文章是對php函數(shù)file_get_contents超時處理的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Laravel5.5以下版本中如何自定義日志行為詳解

    Laravel5.5以下版本中如何自定義日志行為詳解

    這篇文章主要給大家介紹了關(guān)于Laravel5.5以下版本中如何自定義日志行為的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • php基于redis的分布式鎖實例詳解

    php基于redis的分布式鎖實例詳解

    這篇文章主要介紹了php基于redis的分布式鎖實例詳解,有正好需要的可以跟著小編一起來學(xué)習(xí)下,可以讓在寫代碼上的能力更近一步
    2021-03-03
  • laravel5.4生成驗證碼的實例講解

    laravel5.4生成驗證碼的實例講解

    下面小編就為大家?guī)硪黄猯aravel5.4生成驗證碼的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • PHP 修改SESSION的生存時間案例詳解

    PHP 修改SESSION的生存時間案例詳解

    這篇文章主要介紹了PHP 修改SESSION的生存時間案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 兩種php給圖片加水印的實現(xiàn)代碼

    兩種php給圖片加水印的實現(xiàn)代碼

    本文提供了兩種php給圖片加水印的實現(xiàn)代碼,其中一種是添加文字水印,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-07-07
  • laravel中命名路由的使用方法

    laravel中命名路由的使用方法

    這篇文章主要介紹了laravel中命名路由的使用方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • php在windows環(huán)境下獲得cpu內(nèi)存實時使用率(推薦)

    php在windows環(huán)境下獲得cpu內(nèi)存實時使用率(推薦)

    這篇文章主要介紹了php在windows環(huán)境下獲得 cpu 內(nèi)存實時使用率的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Laravel 的數(shù)據(jù)庫遷移的方法

    Laravel 的數(shù)據(jù)庫遷移的方法

    本篇文章主要介紹了Laravel 的數(shù)據(jù)庫遷移的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07

最新評論