力扣棧隊列篇

以下思路來自代碼隨想錄以及官方題解。

文章目錄

      • 232.用棧實現隊列
      • 225.用隊列實現棧
      • 20.有效的括號
      • 1047.刪除字符串中所有相鄰重復項
      • 150.逆波蘭表達式求值
      • 347.前K個高頻元素

232.用棧實現隊列

請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(push、pop、peek、empty):

實現 MyQueue 類:

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

說明:

  • 你只能使用標準的棧操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的語言也許不支持棧。你可以使用 list 或者 deque(雙端隊列)來模擬一個棧,只要是標準的棧操作即可。
輸入:
["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

用棧來實現隊列,區別就是棧是先進后出,而隊列是先進先出,這時就需要使用兩個棧一個作為出棧一個作為入棧來實現先進先出的特點。

class MyQueue {Deque<Integer> inStack;Deque<Integer> outStack;public MyQueue() {inStack = new ArrayDeque<Integer>();outStack = new ArrayDeque<Integer>();}public void push(int x) {inStack.push(x);}public int pop() {if (outStack.isEmpty()) {in2out();}return outStack.pop();}public int peek() {if (outStack.isEmpty()) {in2out();}return outStack.peek();}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty();}private void in2out() {while (!inStack.isEmpty()) {outStack.push(inStack.pop());}}
}

225.用隊列實現棧

請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。

實現 MyStack 類:

  • void push(int x) 將元素 x 壓入棧頂。
  • int pop() 移除并返回棧頂元素。
  • int top() 返回棧頂元素。
  • boolean empty() 如果棧是空的,返回 true ;否則,返回 false
輸入:
["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

用隊列實現棧,還是解決如何將先進先出轉變成先進后出,我們可以在push元素的時候進行翻轉。

class MyStack {Queue<Integer> queue;public MyStack() {queue = new LinkedList<Integer>();}public void push(int x) {int n = queue.size();//添加元素queue.offer(x);for(int i=0;i<n;i++){queue.offer(queue.poll());}}public int pop() {//將隊列首元素彈出return queue.poll();}public int top() {return queue.peek();}public boolean empty() {return queue.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

20.有效的括號

給定一個只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判斷字符串是否有效。

有效字符串需滿足:

  1. 左括號必須用相同類型的右括號閉合。
  2. 左括號必須以正確的順序閉合。
  3. 每個右括號都有一個對應的相同類型的左括號。
輸入:s = "()"
輸出:true輸入:s = "()[]{}"
輸出:true輸入:s = "(]"
輸出:false

思路就是先將符號對應的右括號入棧,當遍歷到不是左括號而是右括號時,就拿右括號與棧頂元素比較,如果一致就出棧,繼續。如果不一致就直接結束。

class Solution {public boolean isValid(String s) {if (s.length() % 2 == 1) {return false;}Deque<Character> deque = new LinkedList<>();char ch;for (int i = 0; i < s.length(); i++) {ch = s.charAt(i);if (ch == '{') {deque.push('}');} else if (ch == '[') {deque.push(']');} else if (ch == '(') {deque.push(')');} else if (deque.isEmpty() || deque.peek() != ch) {return false;} else {deque.pop();}}return deque.isEmpty();}
}

1047.刪除字符串中所有相鄰重復項

給出由小寫字母組成的字符串 S,重復項刪除操作會選擇兩個相鄰且相同的字母,并刪除它們。

在 S 上反復執行重復項刪除操作,直到無法繼續刪除。

在完成所有重復項刪除操作后返回最終的字符串。答案保證唯一。

輸入:"abbaca"
輸出:"ca"
解釋:
例如,在 "abbaca" 中,我們可以刪除 "bb" 由于兩字母相鄰且相同,這是此時唯一可以執行刪除操作的重復項。之后我們得到字符串 "aaca",其中又只有 "aa" 可以執行重復項刪除操作,所以最后的字符串為 "ca"
class Solution {public String removeDuplicates(String s) {Deque<Character> deque = new LinkedList<>();for(int i=0;i<s.length();i++){if(!deque.isEmpty() && s.charAt(i)==deque.peek()){deque.pop();continue;}deque.push(s.charAt(i));}//棧中字符連接成字符串 caStringBuilder result = new StringBuilder();while (!deque.isEmpty()) {result.insert(0, deque.pop());}return result.toString(); }
}

150.逆波蘭表達式求值

給你一個字符串數組 tokens ,表示一個根據 逆波蘭表示法 表示的算術表達式。

請你計算該表達式。返回一個表示表達式值的整數。

  • 有效的算符為 ‘+’、‘-’、‘*’ 和 ‘/’ 。
  • 每個操作數(運算對象)都可以是一個整數或者另一個表達式。
  • 兩個整數之間的除法總是 向零截斷 。
  • 表達式中不含除零運算。
  • 輸入是一個根據逆波蘭表示法表示的算術表達式。
  • 答案及所有中間計算結果可以用 32 位 整數表示。
輸入:tokens = ["2","1","+","3","*"]
輸出:9
解釋:該算式轉化為常見的中綴算術表達式為:((2 + 1) * 3) = 9輸入:tokens = ["4","13","5","/","+"]
輸出:6
解釋:該算式轉化為常見的中綴算術表達式為:(4 + (13 / 5)) = 6輸入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
輸出:22
解釋:該算式轉化為常見的中綴算術表達式為:((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
class Solution {public int evalRPN(String[] tokens) {Deque<Integer> stack = new LinkedList<Integer>();int n = tokens.length;for (int i = 0; i < n; i++) {String token = tokens[i];if (isNumber(token)) {// 如果是數,進棧stack.push(Integer.parseInt(token));} else {// 如果不是數,取數,先是右操作數,后是左操作數int num2 = stack.pop();int num1 = stack.pop();switch (token) {case "+":stack.push(num1 + num2);break;case "-":stack.push(num1 - num2);break;case "*":stack.push(num1 * num2);break;case "/":stack.push(num1 / num2);break;}}}return stack.pop();}public boolean isNumber(String token) {return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));}}

347.前K個高頻元素

給你一個整數數組 nums 和一個整數 k ,請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]輸入: nums = [1], k = 1
輸出: [1]

我的解題思路是使用HashMap將所有出現的數字的頻率以鍵值對形式記錄下來,然后再進行操作。

class Solution {public int[] topKFrequent(int[] nums, int k) {HashMap<Integer, Integer> map = new HashMap();for (int i = 0; i < nums.length; i++) {if (map.containsKey(nums[i])) {map.put(nums[i], map.get(nums[i]) + 1);continue;}map.put(nums[i], 0);}// 將map按照value大小進行排序,并取值前k大keyList<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));int[] result = new int[k];for (int i = 0; i < k; i++) {result[i] = list.get(i).getKey();}return result;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719509.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719509.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719509.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OSError: [WinError 1455] 頁面文件太小,無法完成操作。

[問題描述]&#xff1a;OSError: [WinError 1455] 頁面文件太小&#xff0c;無法完成操作。 原因1&#xff1a;線程數太大 方法&#xff1a;改小線程&#xff08;workers&#xff09;數。 原因2&#xff1a;虛擬內存太小或為0&#xff0c;調大虛擬內存。 方法&#xff1a;右鍵…

mysql索引過長Specialed key was too long的解決方法

在創建要給表的時候遇到一個有意思的問題&#xff0c;提示Specified key was too long; max key length is 767 bytes&#xff0c;從描述上來看&#xff0c;是Key太長&#xff0c;超過了指定的 767字節限制。通常出現在嘗試創建一個過長的唯一鍵&#xff08;UNIQUE KEY&#xf…

Vue.js 實用技巧:深入理解 Vue.mixin

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 &#x1f35a; 藍橋云課簽約作者、上架課程《Vue.js 和 E…

uniapp真機運行的時候顯示同步資源失敗,未得到同步資源的授權,請停止運行后重新運行,并注意手機上的授權提示

1、問題 在添加清單文件之前&#xff0c;項目運行都是好好的&#xff0c;添加了清單項目以后&#xff0c;基座一打就報這個錯&#xff0c;并且手機在安裝基座的時候會提示解析包時失敗&#xff0c; 2、解決方案 打開我的清單文件&#xff0c;我發現我和官網寫的清單文件不一…

華為OD機試“HJ2計算某字符出現次數”不區分大小寫Java編程解答

描述 寫出一個程序&#xff0c;接受一個由字母、數字和空格組成的字符串&#xff0c;和一個字符&#xff0c;然后輸出輸入字符串中該字符的出現次數。&#xff08;不區分大小寫字母&#xff09; 數據范圍&#xff1a; 1≤n≤1000 輸入描述&#xff1a; 第一行輸入一個由字…

【Linux進程間通信】共享內存

【Linux進程間通信】共享內存 目錄 【Linux進程間通信】共享內存system V共享內存共享內存示意圖共享內存的數據結構共享內存函數將共享內存掛接到對應的進程將共享內存取消掛接釋放共享內存 共享內存的特性共享內存擴展共享內存配合管道進行使用 作者&#xff1a;愛寫代碼的剛…

用docker部署后端項目

一、搭建局域網 1.1、介紹前后端項目搭建 需要4臺服務器&#xff0c;在同一個局域網中 1.2、操作 # 搭建net-ry局域網&#xff0c;用于部署若依項目 net-ry&#xff1a;名字 docker network create net-ry --subnet172.68.0.0/16 --gateway172.68.0.1#查看 docker network ls…

Git 安全遠程訪問:SSH 密鑰對生成、添加和連接步驟解析

使用 SSH 密鑰對的 Git 安全遠程訪問&#xff1a;生成、添加和連接 SSH&#xff08;Secure Shell&#xff09;是一種用于安全遠程訪問的協議&#xff0c;它提供了加密通信和身份驗證機制。在使用 SSH 連接到遠程 Git 存儲庫時&#xff0c;您可以使用 SSH 密鑰對來確保安全性。…

3d模型合并后一片漆黑是什么原因,怎么解決---模大獅模型網

當合并多個3D模型后&#xff0c;發現整個合并后的模型顯示為一片漆黑通常是由以下幾個可能的原因導致的&#xff1a; 材質設置問題&#xff1a;合并后的模型可能存在材質設置錯誤&#xff0c;導致模型無法正確顯示。檢查每個模型的材質屬性&#xff0c;確保其正確設置&#xff…

老隋藍海項目有哪些?能賺錢嗎?

在創業的海洋中&#xff0c;每個人都渴望找到那片屬于自己的“藍海”&#xff0c;而“老隋藍海項目”便是許多人心中的那片未知海域。那么&#xff0c;老隋藍海項目究竟是指什么?它們又能否成為創業者的新財富之源? 藍海項目的定義 我們要明白&#xff0c;藍海項目通常指的是…

【漏洞復現】某廠商明御WEB應用防火墻任意用戶登錄漏洞

Nx01 產品簡介 安恒明御WEB應用防火墻&#xff08;簡稱WAF&#xff09;是杭州安恒信息技術股份有限公司自主研發的一款專業應用安全防護產品&#xff0c;專注于為網站、APP等Web業務系統提供安全防護。 Nx02 漏洞描述 安恒明御WEB應用防火墻report.php文件存在硬編碼設置的Con…

yolov7添加spd-conv注意力機制

一、spd-conv是什么&#xff1f; SPD-Conv&#xff08;Symmetric Positive Definite Convolution&#xff09;是一種新穎的卷積操作&#xff0c;它主要應用于處理對稱正定矩陣&#xff08;SPD&#xff09;數據。在傳統的卷積神經網絡&#xff08;CNN&#xff09;中&#xff0c;…

人工智能_大模型013_AIGC生成式模型的增強檢索_RAG知識補充檢索_補充私域和實時場景知識_關鍵字檢索增強---人工智能工作筆記0149

什么是RAG,RAG的意思就是,如果一套生成式AIGC大模型,你昨天訓練了以后,那么今天的知識,還沒有給他進行訓練,那么回答的時候,他就會遺漏今天的知識,那么我們就可以通過檢索的手段,把今天的知識,檢索出來,然后補充道prompt中,給這個大模型.讓他參考,這樣就包含了今天的知識相當于…

CY8C42(1.PSoC4 Pioneer Kit開箱及基本使用)

1.開箱 最近了解到賽普拉斯有一種芯片&#xff0c;屬于PSoC系列&#xff0c;與傳統MCU不同&#xff0c;有點類似跨界芯片&#xff0c;于是就買來玩玩了&#xff0c;老實說用完還是很特別的&#xff0c;因為我沒有用過FPGA&#xff0c;不確定是不是FPGA的開發流程&#xff08;有…

怎樣理解vue2和vue3里的雙向數據綁定

在 Vue.js 中&#xff0c;雙向數據綁定意味著當數據變化時&#xff0c;視圖會自動更新&#xff1b;反之&#xff0c;當用戶通過視圖交互導致數據變化時&#xff0c;數據本身也會被更新。這種機制極大地簡化了用戶界面和數據之間的同步過程。 1. Vue2的實現 Vue2使用的是Objec…

MySQL的事務與隔離級別

1. 什么是事務&#xff1f; 數據庫中的事務是指對數據庫執行一批操作&#xff0c;而這些操作最終要么全部執行成功&#xff0c;要么全部失敗&#xff0c;不會存在部分成功的情況。這個時候就需要用到事務。 最經典的例子就是轉賬&#xff0c;你要給朋友小白轉 1000 塊錢&…

一代傳奇宗慶后:把員工寵成上帝

作者&#xff1a;積溪 琥珀酒研社快評&#xff1a; 梅子真是哭了 一代傳奇就此隕落 咱們又少了一個良心企業家 2月25日10時30分 娃哈哈集團創始人、董事長宗慶后 在杭州逝世&#xff0c;享年79歲 在過去一個多月的病危期間 他的病房里最顯眼的 不是呼吸機、檢測儀 而…

智慧城市中的公共服務創新:讓城市生活更便捷

目錄 一、引言 二、智慧城市公共服務創新的實踐 1、智慧交通系統 2、智慧醫療服務 3、智慧教育系統 4、智慧能源管理 三、智慧城市公共服務創新的挑戰 四、智慧城市公共服務創新的前景 五、結論 一、引言 隨著信息技術的迅猛發展&#xff0c;智慧城市已成為現代城市發…

技術總結: PPT繪圖

目錄 寫在前面參考文檔技巧總結PPT中元素的連接立方體調整厚度調整圖形中的文本3D 圖片調整漸變中的顏色 寫在前面 能繪制好一個好看的示意圖非常重要, 在科研和工作中好的示意圖能精準表達出自己的想法, 減少溝通的成本, 可視化的呈現也可以加強自身對系統的理解, 時間很久后…

分分鐘搞定JSON解析

json 庫能夠解析字符串或文本中的 JSON 內容。 該庫將 JSON 解析為 Python 字典或列表&#xff0c;也能將 Python 字典或列表轉換為 JSON 字符串。 解析 JSON 如下的 JSON 格式的字符串&#xff1a; json_string {"first_name": "Guido", "last_na…