1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        包含min函數(shù)的棧

        共 3209字,需瀏覽 7分鐘

         ·

        2021-03-31 18:34

        ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????

        作者丨程序員女朋友的貓

        來(lái)源丨碼農(nóng)小說(shuō)家

        0

        我是一個(gè)無(wú)情的面試官。

        面人無(wú)數(shù),掛人無(wú)數(shù)。

        若想過(guò)我的面試,標(biāo)準(zhǔn)只有一個(gè),那就是公司很缺人。

        招新人,填舊坑。

        1

        今天是我的第1001次當(dāng)面試官,要求卻不是千里挑一,而是一擊必中。

        因?yàn)槲艺衅傅腒PI快完不成了。

        對(duì)面的小伙子,我和他從HTTP協(xié)議談到負(fù)載均衡,從類(lèi)的命名規(guī)范談到JVM調(diào)優(yōu),凡是搬磚用不到的,我們都聊了一遍,相談甚歡。

        我知道我們是一路人,都是為面試而學(xué)習(xí)。

        好了,已經(jīng)快一個(gè)半小時(shí)了,我只會(huì)問(wèn)最后一個(gè)問(wèn)題了。

        他若回答上來(lái)了,我倆之蜜糖。

        他若回答不上來(lái),我倆之砒霜。

        最后一題,必是算法。

        行業(yè)規(guī)則,我必遵從。

        2

        我不急不忙,把題目念給他聽(tīng)。

        重新定義一個(gè)棧的數(shù)據(jù)結(jié)構(gòu) ,在該類(lèi)型中實(shí)現(xiàn)一個(gè)能夠得到棧的最小值的min函數(shù),并且調(diào)用push pop min函數(shù)的時(shí)間復(fù)雜度都是O(1)

        講完題目,他的眼神從驚喜,到思索,再到不解。

        我便知道他刷過(guò)這道題,他也知道自己刷過(guò)這道題,但是他還是假裝不知道自己刷過(guò)這道題。

        此時(shí)此刻,他不像程序員,像演員。

        他略加思索,說(shuō)了一個(gè)他自己都覺(jué)得不是合理的答案,但他還是說(shuō)了出來(lái):

        "我首先想到的是,新增一個(gè)成員變量來(lái)存放最小的元素,每次入棧的時(shí)候,如果新元素比該成員變量的值還小的時(shí)候,則將該成員變量更新為新元素的值。"

        我微微一笑:"那如果記錄最小的元素已經(jīng)出棧了,如何得到下一個(gè)最小的元素呢?"。

        他假裝恍然大悟:"是啊 ,確實(shí)。"。

        于是他拿著筆,看著紙,仿佛在思考怎么表演的這答案更是自己想出來(lái)的。

        我知道,這個(gè)是面試套路,他若直接說(shuō)出來(lái)最佳答案,身為面試官的我難免不會(huì)拓展這個(gè)題目,相反,他要假裝說(shuō)出來(lái)一個(gè)不太好的答案,在我的提示下,他聰明的想到了最優(yōu)解法。

        我有了面子,畢竟在我的指導(dǎo)下他才解決問(wèn)題。

        他有了里子,在緊張的環(huán)境下他仍能快速思考。

        3

        果然,不久他就說(shuō):“我有思路了!”

        然后開(kāi)始默寫(xiě)答案,順便還把用作講解的圖畫(huà)了出來(lái)。

        寫(xiě)完之后,他娓娓道來(lái):"您看,確實(shí)是僅僅記錄最小元素是不夠的,還要記錄當(dāng)前棧中第二小元素,第三小元素。。。為了保存這些元素,我采用了一個(gè)輔助棧"。

        舉個(gè)例子

        當(dāng)插入第一個(gè)元素5的時(shí)候,顯然5是當(dāng)前的最小值,主棧與輔助棧同時(shí)插入
        當(dāng)插入第二個(gè)元素4的時(shí)候,由于4小于當(dāng)前的輔助棧棧頂元素,即4是當(dāng)前的最小元素,則將輔助棧壓入4。
        當(dāng)插入第三個(gè)元素6的時(shí)候,由于6大于當(dāng)前的輔助棧棧頂元素4,則仍然將輔助棧壓入4。
        當(dāng)插入第四個(gè)元素3的時(shí)候,由于3小于當(dāng)前的輔助棧棧頂元素4,此時(shí)最小值應(yīng)為3,則將輔助棧壓入3。

        所以 ,如果我一直將當(dāng)前最小元素壓入輔助棧,那么就能保證輔助棧的棧頂元素都是最小元素。

        如果出棧的時(shí)候,主棧彈出數(shù)據(jù)之后,輔助棧會(huì)一起彈出數(shù)據(jù),即輔助棧的棧頂一直都是當(dāng)前棧的最小元素。

        比如 ,我第一次彈出 主棧的數(shù)字3 之后,輔助棧一起彈出,當(dāng)前最小值為4
        我第二次彈出 主棧的數(shù)字6之后,輔助棧一起彈出,當(dāng)前最小值依然為4

        依次類(lèi)比。

        下面是我寫(xiě)的代碼


        import java.util.Stack;

        class MinStack {

            private Stack<Integer> stack;
            private Stack<Integer> minStack;

            public MinStack() {
                stack=new Stack<>();
                minStack=new Stack<>();
            }

            public void push(int x) {
                stack.push(x);
                if(minStack.isEmpty())
                    minStack.push(x);
                else
                    minStack.push(minStack.peek()<x ? minStack.peek():x);
            }

            public void pop() {
                stack.pop();
                minStack.pop();
            }

            public int min() {
                return minStack.peek();
            }
        }

        其實(shí)很好,這時(shí)候我已經(jīng)決定要他了,而且快中午,再不結(jié)束面試,食堂東坡肘子都快賣(mài)完了。

        于是我贊賞到:"確實(shí)不錯(cuò),代碼很規(guī)范,可以的。"

        他的眼神從開(kāi)心,再到勝券在握,再到微微不屑。

        臉上寫(xiě)滿了兩個(gè)字:"就這"?

        仿佛主客場(chǎng)完全反轉(zhuǎn),下一秒就有可能拒掉我們的offer。

        那一刻我決定,我要教他做事。

        我頓了一頓:"那我們換個(gè)思路,我再拓展一個(gè)題目"

        重新定義一個(gè)隊(duì)列,并實(shí)現(xiàn)函數(shù) max_value 得到隊(duì)列里的最大值,要求函數(shù)max_value、push_back 和 pop_front 的均攤時(shí)間復(fù)雜度都是O(1)。

        他的眼神從失落,再到迷惑不解,再到無(wú)可奈何。

        我知道,真正的對(duì)線才剛剛開(kāi)始。

        為了顯示我的人道主義,我提示到,今天先到這吧,咱倆加個(gè)微信,不用現(xiàn)在想,回頭把代碼發(fā)給我就行。

        他舒了一口氣,但是不知道我這樣做的目的。

        其實(shí)我的目的很簡(jiǎn)單,不想錯(cuò)過(guò)他這個(gè)候選人,更不想錯(cuò)過(guò)東坡肘子。

        魚(yú)和熊掌,我可兼得。

        -End-

        最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來(lái),可以說(shuō)是程序員面試必備!所有資料都整理到網(wǎng)盤(pán)了,歡迎下載!

        點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

        在看點(diǎn)這里好文分享給更多人↓↓

        瀏覽 19
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            色偷偷色偷偷 | 小坏蛋啊灬啊灬用力再用力小新 | 女子裸体杂技俱乐部dvd | 五月天激情影院 | 日韩欧美成人精品一区二区 | 成人免费A片AAA毛片西瓜 | 免费高清无码专区 | 流量变现@wuking6 | 国产成人AV无码一区二区三区 | 国产精品无码永久免费不卡 |