国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

代碼隨想錄刷題筆記(DAY 10)

這篇具有很好參考價(jià)值的文章主要介紹了代碼隨想錄刷題筆記(DAY 10)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

今日總結(jié):快要期末考試了,現(xiàn)在在瘋狂速成,今天稍微緩和了一點(diǎn),應(yīng)該能保證繼續(xù)每天刷題,欠下的那些寒假補(bǔ)上。

Day 10

01. 用棧實(shí)現(xiàn)隊(duì)列(No. 232)

題目鏈接

代碼隨想錄題解

1.1 題目

請(qǐng)你僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作(push、poppeekempty):

實(shí)現(xiàn) MyQueue 類:

  • void push(int x) 將元素 x 推到隊(duì)列的末尾
  • int pop() 從隊(duì)列的開頭移除并返回元素
  • int peek() 返回隊(duì)列開頭的元素
  • boolean empty() 如果隊(duì)列為空,返回 true ;否則,返回 false

說明:

  • 只能 使用標(biāo)準(zhǔn)的棧操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的語言也許不支持棧。你可以使用 list 或者 deque(雙端隊(duì)列)來模擬一個(gè)棧,只要是標(biāo)準(zhǔn)的棧操作即可。

示例 1:

輸入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
輸出:
[null, null, null, 1, 1, false]

解釋:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

提示:

  • 1 <= x <= 9
  • 最多調(diào)用 100push、pop、peekempty
  • 假設(shè)所有操作都是有效的 (例如,一個(gè)空的隊(duì)列不會(huì)調(diào)用 pop 或者 peek 操作)
1.2 筆記

非常經(jīng)典的題目,考察了對(duì)這兩個(gè)數(shù)據(jù)結(jié)構(gòu)的理解。棧實(shí)現(xiàn)了“先進(jìn)后出”而隊(duì)列則是“先進(jìn)先出”,所以如果我們想要借助棧來實(shí)現(xiàn)隊(duì)列的話,很容易就想到我們?cè)谳敵龅臅r(shí)候?qū)V械臄?shù)據(jù)反轉(zhuǎn)即可,那反轉(zhuǎn)如何實(shí)現(xiàn)呢?

這就需要用到兩個(gè)棧:

代碼隨想錄刷題筆記(DAY 10),筆記,算法

即將 Stack1 視作一個(gè) 中轉(zhuǎn)站,當(dāng)我們需要輸出的時(shí)候,就將 Stack1 中的元素 pop()Stack2 中,然后從 Stack2 中取元素。

注意 push() 的時(shí)候要判斷 Stack2 是否為空,如果不為空就會(huì)出現(xiàn)順序問題,因?yàn)榇藭r(shí)的 Stack2 中即將彈出的第一個(gè)元素是我們構(gòu)造的隊(duì)列的第一個(gè)元素,如果我們?cè)?Stack2 還未空的時(shí)候就 push() 新元素進(jìn)來,就打破了確定的順序。

1.3 代碼
class MyQueue {
    Stack<Integer> s1;
    Stack<Integer> s2;

    public MyQueue() {
        // 初始化
        s1 = new Stack<>();
        s2 = new Stack<>();
    }

    public void push(int x) {
        // 每次放入新元素的時(shí)候都暫存到 s1
        s1.push(x);
    }

    public int pop() {
        if (s2.empty()) {
            while (!s1.empty()) {
                s2.push(s1.pop());
            }
        }
        return s2.pop();
    }

    public int peek() {
        // 判斷 s2 是否為空
        if (s2.empty()) {
            while (!s1.empty()) {
                s2.push(s1.pop());
            }
        }
        return s2.peek();
    }

    public boolean empty() {
        return s1.empty() && s2.empty();
    }
}

02. 用隊(duì)列實(shí)現(xiàn)棧

題目鏈接

代碼隨想錄題解

2.1 題目

請(qǐng)你僅使用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、popempty)。

實(shí)現(xiàn) MyStack 類:

  • void push(int x) 將元素 x 壓入棧頂。
  • int pop() 移除并返回棧頂元素。
  • int top() 返回棧頂元素。
  • boolean empty() 如果棧是空的,返回 true ;否則,返回 false 。

注意:

  • 你只能使用隊(duì)列的基本操作 —— 也就是 push to backpeek/pop from front、sizeis empty 這些操作。
  • 你所使用的語言也許不支持隊(duì)列。 你可以使用 list (列表)或者 deque(雙端隊(duì)列)來模擬一個(gè)隊(duì)列 , 只要是標(biāo)準(zhǔn)的隊(duì)列操作即可。

示例:

輸入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
輸出:
[null, null, null, 2, 2, false]

解釋:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9
  • 最多調(diào)用100push、poptopempty
  • 每次調(diào)用 poptop 都保證棧不為空
2.2 筆記

有了上面那道題的經(jīng)驗(yàn),很多朋友拿到這道題就想著想上面那道題一樣倒過來就行了,那怎樣倒過來呢?

簡(jiǎn)單,在創(chuàng)建一個(gè)隊(duì)列然后從第一個(gè)隊(duì)列推入就行了。

但是提交發(fā)現(xiàn)題目還是錯(cuò)了,這是為什么呢?

隊(duì)列是先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),我們把一個(gè)隊(duì)列一個(gè)個(gè)取出放入另一個(gè)隊(duì)列,順序是不會(huì)改變的,就像正數(shù)乘以一個(gè)整數(shù)還是整數(shù),棧能夠倒置原因就是它是先進(jìn)后出,負(fù)數(shù)乘以負(fù)數(shù)結(jié)果就是正數(shù),這樣類比起來就比較好理解。

這道題目可以使用一個(gè)隊(duì)列來實(shí)現(xiàn),隊(duì)列的隊(duì)尾元素是棧的棧頂元素:

代碼隨想錄刷題筆記(DAY 10),筆記,算法

那如果想要?jiǎng)h除這個(gè)隊(duì)尾的元素,我們可以從隊(duì)頭開始遍歷,然后將隊(duì)頭的元素依次放到隊(duì)尾,直到最開始的隊(duì)尾元素(棧頂)是隊(duì)列的隊(duì)頭的時(shí)候停止,也就是需要遍歷 size - 1 次,這時(shí)候?qū)㈥?duì)頭元素彈出得到的就是需要的元素了。

那如何獲取隊(duì)尾元素呢?

我們可以按照上面的方法循環(huán) size- 1 然后得到隊(duì)頭的元素但不刪除。但其實(shí)我們可以設(shè)置一個(gè)變量 lastNum 當(dāng)我們需要隊(duì)尾元素的時(shí)候就直接將這個(gè)返回。

如果沒有刪除元素的話那這個(gè) lastNum 的值就很好確定,我們每次 add() 添加新元素的時(shí)候就將 lastNum 重置為這個(gè)值即可,那如果執(zhí)行了刪除的話,這時(shí)候原本的倒數(shù)第二個(gè)元素就成了新的 lastNum 我們只需要在遍歷到倒數(shù)第二個(gè)元素的時(shí)候?qū)⑵滟x值即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-817956.html

2.3 代碼
class MyStack {
    Queue<Integer> q1;
    int lastNum; // 記錄最后一個(gè)元素的值

    public MyStack() {
        q1 = new ArrayDeque<>();
    }

    public void push(int x) {
        q1.add(x);
        lastNum = x;
    }

    public int pop() {
        int size = q1.size();
        size = size - 1;
        while (size-- > 0) {
            int temp = q1.remove(); // 記錄此時(shí)彈出的元素
            q1.add(temp);
            // 當(dāng)循環(huán)結(jié)束的時(shí)候就將其賦值成倒數(shù)第二個(gè)元素了,其實(shí)等價(jià)于 if (size == 0) {lastNum = temp; }
            lastNum = temp; 
        }
        return q1.remove();
    }

    public int top() {
        return lastNum;
    }

    public boolean empty() {
        return q1.isEmpty();
    }
}

到了這里,關(guān)于代碼隨想錄刷題筆記(DAY 10)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 代碼隨想錄刷題筆記-Day20

    代碼隨想錄刷題筆記-Day20

    236. 二叉樹的最近公共祖先 https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/ 給定一個(gè)二叉樹, 找到該樹中兩個(gè)指定節(jié)點(diǎn)的最近公共祖先。 百度百科中最近公共祖先的定義為:“對(duì)于有根樹 T 的兩個(gè)節(jié)點(diǎn) p、q,最近公共祖先表示為一個(gè)節(jié)點(diǎn) x,滿足 x 是 p、q 的祖先且 x 的深

    2024年02月21日
    瀏覽(23)
  • 【代碼隨想錄】刷題Day36

    435. 無重疊區(qū)間 先從小到大排序,其實(shí)本題依然是求出共同區(qū)域,只不過題目需要我們刪除盡量少的區(qū)間。所以我們需要?jiǎng)h除的一定是范圍跨度大的并且跟其他有公共區(qū)間的區(qū)域。所以每次更新右邊范圍都需要考慮最小的范圍。 1.if(intervals[i][0]end),說明有重復(fù)的區(qū)間,那么我

    2024年02月07日
    瀏覽(93)
  • 【代碼隨想錄】刷題Day41

    343. 整數(shù)拆分 1.dp數(shù)組的含義:第i個(gè)就表示當(dāng)前i能被拆分出相乘最大的整數(shù) 2.那么其實(shí),所謂的后續(xù)的i對(duì)應(yīng)的相乘最大整數(shù)其實(shí)就是前面的相乘最大整數(shù)拼湊而成,為了更好的區(qū)分我們將分離出來的數(shù)為j,那么我們的工作就是將一個(gè)又一個(gè)的j從i中剝離出,隨后相乘即可。那

    2024年02月07日
    瀏覽(23)
  • 【代碼隨想錄】刷題Day47

    198. 打家劫舍 1.dp數(shù)組含義:dp[i]為i位置下的最大能得到的價(jià)值 2.根據(jù)條件:相鄰不能偷。i位置的最大價(jià)值取決于i-1位置是否已經(jīng)偷過了。如果偷過了,i位置的最大價(jià)值就是dp[i-1],即i位置的物品不偷;如果沒有偷過,i位置的最大價(jià)值就是dp[i-2]+nuvms[i],i位置的數(shù)和對(duì)應(yīng)的d

    2024年02月07日
    瀏覽(107)
  • 【代碼隨想錄】刷題Day31

    【代碼隨想錄】刷題Day31

    455. 分發(fā)餅干 貪心的思路就是:小的餅干盡量去匹配胃口小的孩子,這樣才能實(shí)現(xiàn)盡可能多孩子吃到。 那么代碼就很好寫了: 1.排序g和s,這樣方便查找小的數(shù) 2.餅干的位置不停遍歷,對(duì)應(yīng)我們需要一個(gè)ret代表當(dāng)前孩子位置 3.如果當(dāng)前位置為孩子的數(shù)量,說明ret記錄下所有的

    2024年02月06日
    瀏覽(92)
  • 【代碼隨想錄】刷題Day35

    860. 檸檬水找零 1.如果第一個(gè)顧客沒有五元,那么直接返回false,因?yàn)榈曛鏖_始沒有零錢 2.定義兩個(gè)int,一個(gè)記錄5元,一個(gè)記錄10元,隨后遍歷整個(gè)數(shù)組,會(huì)出現(xiàn)三種情況: 如果顧客給5元,直接num5加一 如果顧客給10元,判斷num5是否大于0,大于則num5--,num10++;反之返回false

    2024年02月06日
    瀏覽(22)
  • 代碼隨想錄刷題 Day14

    二叉法的前中后序的遍歷, 前中后所說的是根節(jié)點(diǎn)輸出的順序;? 有兩種遍歷方式, 1. 遞歸法 (自己調(diào)用自己,本質(zhì)是用棧) 代碼比較簡(jiǎn)單,但是需要?jiǎng)?chuàng)建一個(gè)額外的函數(shù)來進(jìn)行自己調(diào)用自己的過程;用遞歸法的話三種遍歷方式只需要改變代碼的位置就可以。 Leetcode 對(duì)應(yīng)

    2024年02月08日
    瀏覽(26)
  • 【代碼隨想錄】刷題Day6

    242. 有效的字母異位詞 直接使用庫函數(shù)的multiset來判斷 其實(shí)沒什么好說的,因?yàn)樽址兄貜?fù)的可以出現(xiàn)所以用的multiset 缺點(diǎn):確實(shí)浪費(fèi)空間,紅黑樹的插入刪除,浪費(fèi)時(shí)間 2.數(shù)組實(shí)現(xiàn) 26個(gè)小寫字母,而且是連續(xù)的,那么我們直接用數(shù)組來存儲(chǔ)也可以的 1.那么映射的方式也很

    2024年02月02日
    瀏覽(33)
  • 【代碼隨想錄】刷題Day4

    【代碼隨想錄】刷題Day4

    24. 兩兩交換鏈表中的節(jié)點(diǎn) 前后指針實(shí)現(xiàn) 1.沒有元素或者只有一個(gè)元素?zé)o意義 2.給出一個(gè)前驅(qū)prev,以及用來交換的兩個(gè)節(jié)點(diǎn)cur和next 3.我當(dāng)時(shí)是這么想的,如果兩個(gè)指針一起動(dòng),那么就要用cur和next同時(shí)判斷結(jié)束,也許這個(gè)條件會(huì)比較苛刻(我就煩這種邊界條件),所以我覺得動(dòng)一

    2023年04月22日
    瀏覽(37)
  • 代碼隨想錄刷題 Day15

    代碼隨想錄刷題 Day15

    1. 二叉樹遍歷的層序方法, 記住模板后可以做下面十道題,現(xiàn)在暫時(shí)只做了102; 102.二叉樹的層序遍歷 107.二叉樹的層次遍歷II 199.二叉樹的右視圖 637.二叉樹的層平均值 429.N叉樹的層序遍歷 515.在每個(gè)樹行中找最大值 116.填充每個(gè)節(jié)點(diǎn)的下一個(gè)右側(cè)節(jié)點(diǎn)指針 117.填充每個(gè)節(jié)點(diǎn)的

    2024年02月06日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包