欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
程序員面試題精選(02)-設計包含min函數的棧
題目:定義棧的數據結構,要求添加一個(gè)min函數,能夠得到棧的最小元素。要求函數min、push以及pop的時(shí)間復雜度都是O(1)。
分析:這是去年google的一道面試題。
我看到這道題目時(shí),第一反應就是每次push一個(gè)新元素時(shí),將棧里所有逆序元素排序。這樣棧頂元素將是最小元素。但由于不能保證最后push進(jìn)棧的元素最先出棧,這種思路設計的數據結構已經(jīng)不是一個(gè)棧了。
在棧里添加一個(gè)成員變量存放最小元素(或最小元素的位置)。每次push一個(gè)新元素進(jìn)棧的時(shí)候,如果該元素比當前的最小元素還要小,則更新最小元素。
乍一看這樣思路挺好的。但仔細一想,該思路存在一個(gè)重要的問(wèn)題:如果當前最小元素被pop出去,如何才能得到下一個(gè)最小元素?
因此僅僅只添加一個(gè)成員變量存放最小元素(或最小元素的位置)是不夠的。我們需要一個(gè)輔助棧。每次push一個(gè)新元素的時(shí)候,同時(shí)將最小元素(或最小元素的位置??紤]到棧元素的類(lèi)型可能是復雜的數據結構,用最小元素的位置將能減少空間消耗)push到輔助棧中;每次pop一個(gè)元素出棧的時(shí)候,同時(shí)pop輔助棧。
參考代碼:
#include <deque>
#include <assert.h>
template <typename T> class CStackWithMin
{
public:
CStackWithMin(void) {}
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:
T> m_data;               // the elements of stack
size_t> m_minIndex;      // the indices of minimum elements
};
// get the last element of mutable stack
template <typename T> T& CStackWithMin<T>::top()
{
return m_data.back();
}
// get the last element of non-mutable stack
template <typename T> const T& CStackWithMin<T>::top() const
{
return m_data.back();
}
// insert an elment at the end of stack
template <typename T> void CStackWithMin<T>::push(const T& value)
{
// append the data into the end of m_data
m_data.push_back(value);
// set the index of minimum elment in m_data at the end of m_minIndex
if(m_minIndex.size() == 0)
m_minIndex.push_back(0);
else
{
if(value < m_data[m_minIndex.back()])
m_minIndex.push_back(m_data.size() - 1);
else
m_minIndex.push_back(m_minIndex.back());
}
}
// erease the element at the end of stack
template <typename T> void CStackWithMin<T>::pop()
{
// pop m_data
m_data.pop_back();
// pop m_minIndex
m_minIndex.pop_back();
}
// get the minimum element of stack
template <typename T> const T& CStackWithMin<T>::min() const
{
assert(m_data.size() > 0);
assert(m_minIndex.size() > 0);
return m_data[m_minIndex.back()];
}
討論:如果思路正確,編寫(xiě)上述代碼不是一件很難的事情。但如果能注意一些細節無(wú)疑能在面試中加分。比如我在上面的代碼中做了如下的工作:
·         用模板類(lèi)實(shí)現。如果別人的元素類(lèi)型只是int類(lèi)型,模板將能給面試官帶來(lái)好印象;
·         兩個(gè)版本的top函數。在很多類(lèi)中,都需要提供const和非const版本的成員訪(fǎng)問(wèn)函數;
·         min函數中assert。把代碼寫(xiě)的盡量安全是每個(gè)軟件公司對程序員的要求;
·         添加一些注釋。注釋既能提高代碼的可讀性,又能增加代碼量,何樂(lè )而不為?
總之,在面試時(shí)如果時(shí)間允許,盡量把代碼寫(xiě)的漂亮一些。說(shuō)不定代碼中的幾個(gè)小亮點(diǎn)就能讓自己輕松拿到心儀的Offer。
正在加載中...
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C++實(shí)現兩個(gè)棧實(shí)現一個(gè)隊列和兩個(gè)隊列實(shí)現一個(gè)棧
Simple set 簡(jiǎn)單集合類(lèi)模板
解讀C 編程中類(lèi)模板的三種特化
多年學(xué)習C++STL經(jīng)典總結
C++ STL 容器技術(shù)之 vector向量容器
qsort和sort
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久