程式設計師面試題精選 02 設計包含min函式的棧

2021-05-23 20:22:15 字數 2490 閱讀 3481

程式設計師面試題精選(02)-設計包含min函式的棧

題目:定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min、push以及pop的時間複雜度都是o(1)。 分析:這是去年google的一道面試題。

我看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後push進棧的元素最先出棧,這種思路設計的資料結構已經不是乙個棧了。

在棧裡新增乙個成員變數存放最小元素(或最小元素的位置)。每次push乙個新元素進棧的時候,如果該元素比當前的最小元素還要小,則更新最小元素。

乍一看這樣思路挺好的。但仔細一想,該思路存在乙個重要的問題:如果當前最小元素被pop出去,如何才能得到下乙個最小元素?

因此僅僅只新增乙個成員變數存放最小元素(或最小元素的位置)是不夠的。我們需要乙個輔助棧。每次push乙個新元素的時候,同時將最小元素(或最小元素的位置。考慮到棧元素的型別可能是複雜的資料結構,用最小元素的位置將能減少空間消耗)push到輔助棧中;每次pop乙個元素出棧的時候,同時pop輔助棧。

參考**:

#include 

#include 

template <

typename

t> 

class

cstackwithmin

virtual

~cstackwithmin(

void

) {}

t& top(

void

);const

t& top(

void

) const

;void

push(

const

t& value);

void

pop(

void

);const

t& min(

void

) const

;private:

dequem_data;

// the elements of stack

dequem_minindex;

// the indices of minimum elements

};// get the last element of mutable stack

template <

typename

t> t& cstackwithmin::top()

// get the last element of non-mutable stack

template <

typename

t> 

const

t& cstackwithmin::top() 

const

// insert an elment at the end of stack

template <

typename

t> 

void

cstackwithmin::push(

const

t& value)

}// erease the element at the end of stack

template <

typename

t> 

void

cstackwithmin::pop()

// get the minimum element of stack

template <

typename

t> 

const

t& cstackwithmin::min() 

const

舉個例子演示上述**的執行過程:

步驟資料棧

輔助棧最小值

1.push 330

32.push 4

3,40,0

33.push 2

3,4,2

0,0,2

24.push 1

3,4,2,1

0,0,2,3

15.pop

3,4,2

0,0,2

26.pop

3,40,0

37.push 0

3,4,0

0,0,2

0討論:如果思路正確,編寫上述**不是一件很難的事情。但如果能注意一些細節無疑能在面試中加分。比如我在上面的**中做了如下的工作:

·         用模板類實現。如果別人的元素型別只是int型別,模板將能給面試官帶來好印象;

·         兩個版本的top函式。在很多類中,都需要提供const和非const版本的成員訪問函式;

·         

min函式中assert。把**寫的盡量安全是每個軟體公司對程式設計師的要求;

·         新增一些注釋。注釋既能提高**的可讀性,又能增加**量,何樂而不為?

總之,在面試時如果時間允許,盡量把**寫的漂亮一些。說不定**中的幾個小亮點就能讓自己輕鬆拿到心儀的offer。

程式設計師面試題精選

問題描述 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a b c所能排列出來的所有字串abc acb bac bca cab和cba。問題分析 這是一道很好的考查對遞迴理解的程式設計題。寫遞迴程式關鍵有兩點,處理好進入與返回的關係,進入時改變了什麼,返回時應當恢復。字...

程式設計師面試題精選 01 設計包含min函式的棧

題目 定義棧的資料結構,要求新增乙個min函式,能夠得到棧的最小元素。要求函式min push以及pop的時間複雜度都是o 1 分析 這是去年google的一道面試題。我看到這道題目時,第一反應就是每次push乙個新元素時,將棧裡所有逆序元素排序。這樣棧頂元素將是最小元素。但由於不能保證最後push...

程式設計師面試題精選100題

今天開始各種刷面試題,沉下心來集中時間,全身心投入 題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。比如將二元查詢樹 10 6 14 4 8 12 16 轉換成雙向鍊錶 4 6 8 10 12 14 16。相關概念 二元查詢樹 它首先要是...