日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 栈【测试题】

發(fā)布時(shí)間:2023/12/10 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 栈【测试题】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1.刪除最外層的括號(hào)
      • 信息
      • 要求
      • 答案
    • 2.棒球比賽
      • 信息
      • 示例
      • 答案
    • 3. 用棧實(shí)現(xiàn)隊(duì)列
      • 要求
      • 說(shuō)明:
      • 答案
    • 4.用隊(duì)列模擬棧
      • 描述
      • 注意
      • 答案
    • 5.下一個(gè)更大的元素(未解)
      • 信息:
      • 示例:
      • 注意:
      • 答案:
    • 6.刪除字符串中的所有相鄰重復(fù)項(xiàng)
      • 信息
      • 示例:
      • 答案:
    • 7. 獲取棧中的最小元素 (時(shí)間復(fù)雜度較大)
      • 信息
      • 示例:
      • 答案
    • 8.比較包含退格的兩個(gè)字符串(復(fù)雜度都比較低)
      • 信息
      • 示例:
      • 答案
    • 9.判斷是否是有效的括號(hào)(很巧妙)
      • 信息:
      • 示例:
      • 答案:
    • 10.二叉樹(shù)的中序遍歷(左跟右)
      • 信息
      • 答案
    • 11.二叉樹(shù)的前序遍歷(根左右)
      • 信息
      • 答案
    • 12.二叉樹(shù)的后序排列(順序是:左右根)
      • 信息
      • 答案
    • 13.使括號(hào)有效的最少添加(巧妙)
      • 信息
      • 示例
      • 答案
    • 14.二叉搜索樹(shù)迭代器
      • 二叉搜索樹(shù)
      • 信息
      • 答案
    • 15.扁平化嵌套列表迭代器
      • 信息
      • 示例:
      • 答案

1.刪除最外層的括號(hào)

信息

有效括號(hào)字符串為空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括號(hào)字符串,+ 代表字符串的連接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括號(hào)字符串。

如果有效字符串 S 非空,且不存在將其拆分為 S = A+B 的方法,我們稱(chēng)其為原語(yǔ)(primitive),其中 A 和 B 都是非空有效括號(hào)字符串。

給出一個(gè)非空有效字符串 S,考慮將其進(jìn)行原語(yǔ)化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括號(hào)字符串原語(yǔ)。

對(duì) S 進(jìn)行原語(yǔ)化分解,刪除分解中每個(gè)原語(yǔ)字符串的最外層括號(hào),返回 S 。

要求

示例 1:

輸入:"(()())(())" 輸出:"()()()" 解釋: 輸入字符串為 "(()())(())",原語(yǔ)化分解得到 "(()())" + "(())", 刪除每個(gè)部分中的最外層括號(hào)后得到 "()()" + "()" = "()()()"。

示例 2:

輸入:"(()())(())(()(()))" 輸出:"()()()()(())" 解釋: 輸入字符串為 "(()())(())(()(()))",原語(yǔ)化分解得到 "(()())" + "(())" + "(()(()))", 刪除每隔部分中的最外層括號(hào)后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3:

輸入:"()()" 輸出:"" 解釋: 輸入字符串為 "()()",原語(yǔ)化分解得到 "()" + "()", 刪除每個(gè)部分中的最外層括號(hào)后得到 "" + "" = ""。

答案

class Solution(object):def removeOuterParentheses(self, S):""":type S: str:rtype: str"""last, cur_len = 0, 0result = []for i, each in enumerate(S):if each == '(':cur_len += 1if each == ')':cur_len -= 1if cur_len == 0:result.append(S[last + 1:i])last = i + 1return ''.join(result)solution = Solution() print(solution.removeOuterParentheses('()()'))

2.棒球比賽

信息

你現(xiàn)在是棒球比賽記錄員。
給定一個(gè)字符串列表,每個(gè)字符串可以是以下四種類(lèi)型之一:
1.整數(shù)(一輪的得分):直接表示您在本輪中獲得的積分?jǐn)?shù)。
2. “+”(一輪的得分):表示本輪獲得的得分是前兩輪有效 回合得分的總和。
3. “D”(一輪的得分):表示本輪獲得的得分是前一輪有效 回合得分的兩倍。
4. “C”(一個(gè)操作,這不是一個(gè)回合的分?jǐn)?shù)):表示您獲得的最后一個(gè)有效 回合的分?jǐn)?shù)是無(wú)效的,應(yīng)該被移除。

每一輪的操作都是永久性的,可能會(huì)對(duì)前一輪和后一輪產(chǎn)生影響。
你需要返回你在所有回合中得分的總和。

示例

示例 1:

輸入: [“5”,“2”,“C”,“D”,"+"]
輸出: 30
解釋:
第1輪:你可以得到5分。總和是:5。
第2輪:你可以得到2分。總和是:7。
操作1:第2輪的數(shù)據(jù)無(wú)效。總和是:5。
第3輪:你可以得到10分(第2輪的數(shù)據(jù)已被刪除)。總數(shù)是:15。
第4輪:你可以得到5 + 10 = 15分。總數(shù)是:30。
示例 2:

輸入: [“5”,"-2",“4”,“C”,“D”,“9”,"+","+"]
輸出: 27
解釋:
第1輪:你可以得到5分。總和是:5。
第2輪:你可以得到-2分。總數(shù)是:3。
第3輪:你可以得到4分。總和是:7。
操作1:第3輪的數(shù)據(jù)無(wú)效。總數(shù)是:3。
第4輪:你可以得到-4分(第三輪的數(shù)據(jù)已被刪除)。總和是:-1。
第5輪:你可以得到9分。總數(shù)是:8。
第6輪:你可以得到-4 + 9 = 5分。總數(shù)是13。
第7輪:你可以得到9 + 5 = 14分。總數(shù)是27。
注意:

輸入列表的大小將介于1和1000之間。
列表中的每個(gè)整數(shù)都將介于-30000和30000之間。

答案

class Solution:def calPoints(self, ops):""":type ops: List[str]:rtype: int"""res = []for i in range(len(ops)):if ops[i] == "C":res.pop()elif ops[i] == "D":res.append(res[-1] * 2)elif ops[i] == '+':res.append(res[-1] + res[-2])else:res.append(int(ops[i]))return sum(res)

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

要求

使用棧實(shí)現(xiàn)隊(duì)列的下列操作:

push(x) – 將一個(gè)元素放入隊(duì)列的尾部。
pop() – 從隊(duì)列首部移除元素。
peek() – 返回隊(duì)列首部的元素。
empty() – 返回隊(duì)列是否為空。
示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false

說(shuō)明:

你只能使用標(biāo)準(zhǔn)的棧操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的語(yǔ)言也許不支持棧。你可以使用 list 或者 deque(雙端隊(duì)列)來(lái)模擬一個(gè)棧,只要是標(biāo)準(zhǔn)的棧操作即可。
假設(shè)所有操作都是有效的 (例如,一個(gè)空的隊(duì)列不會(huì)調(diào)用 pop 或者 peek 操作)。

答案

from collections import deque class MyQueue:def __init__(self):"""Initialize your data structure here."""self.Myqueue = deque()def push(self, x: int) -> None:"""Push element x to the back of queue."""self.Myqueue.append(x)def pop(self) -> int:"""Removes the element from in front of queue and returns that element."""if len(self.Myqueue) > 0:return self.Myqueue.popleft()else:return Nonedef peek(self) -> int:"""Get the front element."""if len(self.Myqueue) > 0:return self.Myqueue[0]else:return Nonedef empty(self) -> bool:"""Returns whether the queue is empty."""return len(self.Myqueue) == 0

4.用隊(duì)列模擬棧

描述

使用隊(duì)列實(shí)現(xiàn)棧的下列操作:

  • push(x) – 元素 x 入棧
  • pop() – 移除棧頂元素
  • top() – 獲取棧頂元素
  • empty() – 返回棧是否為空

注意

你只能使用隊(duì)列的基本操作– 也就是 push to back, peek/pop from front, size, 和 is empty 這些操作是合法的。
你所使用的語(yǔ)言也許不支持隊(duì)列。 你可以使用 list 或者 deque(雙端隊(duì)列)來(lái)模擬一個(gè)隊(duì)列 , 只要是標(biāo)準(zhǔn)的隊(duì)列操作即可。
你可以假設(shè)所有操作都是有效的(例如, 對(duì)一個(gè)空的棧不會(huì)調(diào)用 pop 或者 top 操作)。

答案

class MyStack(object):def __init__(self):"""Initialize your data structure here."""self.stack = []self.length = 0def push(self, x):"""Push element x onto stack.:type x: int:rtype: None"""self.stack.append(x)self.length += 1def pop(self):"""Removes the element on top of the stack and returns that element.:rtype: int"""if self.empty() is False:self.length -= 1return self.stack.pop()def top(self):"""Get the top element.:rtype: int"""if self.empty() is False:return self.stack[self.length - 1]def empty(self):"""Returns whether the stack is empty.:rtype: bool"""if len(self.stack) == 0:return Truereturn False

5.下一個(gè)更大的元素(未解)

信息:

給定兩個(gè)沒(méi)有重復(fù)元素的數(shù)組 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每個(gè)元素在 nums2 中的下一個(gè)比其大的值。

nums1 中數(shù)字 x 的下一個(gè)更大元素是指 x 在 nums2 中對(duì)應(yīng)位置的右邊的第一個(gè)比 x 大的元素。如果不存在,對(duì)應(yīng)位置輸出-1。

示例:

示例 1:

輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出: [-1,3,-1]
解釋:
對(duì)于num1中的數(shù)字4,你無(wú)法在第二個(gè)數(shù)組中找到下一個(gè)更大的數(shù)字,因此輸出 -1。
對(duì)于num1中的數(shù)字1,第二個(gè)數(shù)組中數(shù)字1右邊的下一個(gè)較大數(shù)字是 3。
對(duì)于num1中的數(shù)字2,第二個(gè)數(shù)組中沒(méi)有下一個(gè)更大的數(shù)字,因此輸出 -1。
示例 2:

輸入: nums1 = [2,4], nums2 = [1,2,3,4].
輸出: [3,-1]
解釋:
對(duì)于num1中的數(shù)字2,第二個(gè)數(shù)組中的下一個(gè)較大數(shù)字是3。
對(duì)于num1中的數(shù)字4,第二個(gè)數(shù)組中沒(méi)有下一個(gè)更大的數(shù)字,因此輸出 -1。

注意:

nums1和nums2中所有元素是唯一的。
nums1和nums2 的數(shù)組大小都不超過(guò)1000。

答案:

未解

6.刪除字符串中的所有相鄰重復(fù)項(xiàng)

信息

給出由小寫(xiě)字母組成的字符串 S,重復(fù)項(xiàng)刪除操作會(huì)選擇兩個(gè)相鄰且相同的字母,并刪除它們。

在 S 上反復(fù)執(zhí)行重復(fù)項(xiàng)刪除操作,直到無(wú)法繼續(xù)刪除。

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

示例:

輸入:“abbaca”
輸出:“ca”
解釋:
例如,在 “abbaca” 中,我們可以刪除 “bb” 由于兩字母相鄰且相同,這是此時(shí)唯一可以執(zhí)行刪除操作的重復(fù)項(xiàng)。之后我們得到字符串 “aaca”,其中又只有 “aa” 可以執(zhí)行重復(fù)項(xiàng)刪除操作,所以最后的字符串為 “ca”。

提示:1 <= S.length <= 20000 S 僅由小寫(xiě)英文字母組成。

答案:

class Solution:def removeDuplicates(self, S: str) -> str:stack=[] # 定義一個(gè)棧for i in S:if not stack: # 如果當(dāng)前棧為空stack.append(i)elif i == stack[-1]: # 如果當(dāng)前元素與棧頂元素相等stack.pop()else:stack.append(i)return ''.join(stack)

7. 獲取棧中的最小元素 (時(shí)間復(fù)雜度較大)

信息

設(shè)計(jì)一個(gè)支持 push,pop,top 操作,并能在常數(shù)時(shí)間內(nèi)檢索到最小元素的棧。

push(x) – 將元素 x 推入棧中。
pop() – 刪除棧頂?shù)脑亍?br /> top() – 獲取棧頂元素。
getMin() – 檢索棧中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.

答案

class MinStack:def __init__(self):"""initialize your data structure here."""self.stack = []self.flag=0def push(self, x: int) -> None:self.stack.append(x)def pop(self) -> None:if self.stack:self.stack.pop()def top(self) -> int:if self.stack:return self.stack[-1]def getMin(self) -> int:self.flag = self.stack[0]for i in self.stack:if self.flag > i:self.flag = ireturn self.flag

執(zhí)行結(jié)果:

執(zhí)行用時(shí) :
2828 ms, 在所有 Python3 提交中擊敗了5.02%的用戶(hù)
內(nèi)存消耗 :
16 MB, 在所有 Python3 提交中擊敗了99.88%的用戶(hù)

8.比較包含退格的兩個(gè)字符串(復(fù)雜度都比較低)

信息

給定 S 和 T 兩個(gè)字符串,當(dāng)它們分別被輸入到空白的文本編輯器后,判斷二者是否相等,并返回結(jié)果。 # 代表退格字符。

示例:

示例 1:

輸入:S = “ab#c”, T = “ad#c”
輸出:true
解釋:S 和 T 都會(huì)變成 “ac”。
示例 2:

輸入:S = “ab##”, T = “c#d#”
輸出:true
解釋:S 和 T 都會(huì)變成 “”。
示例 3:

輸入:S = “a##c”, T = “#a#c”
輸出:true
解釋:S 和 T 都會(huì)變成 “c”。
示例 4:

輸入:S = “a#c”, T = “b”
輸出:false
解釋:S 會(huì)變成 “c”,但 T 仍然是 “b”。

答案

class Solution:def backspaceCompare(self, S: str, T: str) -> bool:# 新建兩個(gè)棧stack_a = []stack_b = [] for i in S:if i != '#':stack_a.append(i)elif i == '#' and stack_a:stack_a.pop()for i in T:if i != '#':stack_b.append(i)elif i == '#' and stack_b:stack_b.pop()return stack_a == stack_b

執(zhí)行結(jié)果:
執(zhí)行用時(shí) :44 ms, 在所有 Python3 提交中擊敗了96.89%的用戶(hù)
內(nèi)存消耗 :13 MB, 在所有 Python3 提交中擊敗了98.24%的用戶(hù)

9.判斷是否是有效的括號(hào)(很巧妙)

信息:

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

有效字符串需滿足:

左括號(hào)必須用相同類(lèi)型的右括號(hào)閉合。
左括號(hào)必須以正確的順序閉合。
注意空字符串可被認(rèn)為是有效字符串。

示例:

示例 1:

輸入: “()”
輸出: true
示例 2:

輸入: “()[]{}”
輸出: true
示例 3:

輸入: “(]”
輸出: false
示例 4:

輸入: “([)]”
輸出: false
示例 5:

輸入: “{[]}”
輸出: true

答案:

class Solution:def isValid(self, s: str) -> bool:while '{}' in s or '()' in s or '[]' in s:s = s.replace('{}', '')s = s.replace('[]', '')s = s.replace('()', '')return s == ''

10.二叉樹(shù)的中序遍歷(左跟右)

信息

給定一個(gè)二叉樹(shù),返回它的中序 遍歷。

示例:

輸入: [1,null,2,3]
1

2
/
3

輸出: [1,3,2]
進(jìn)階: 遞歸算法很簡(jiǎn)單,你可以通過(guò)迭代算法完成嗎?

答案

class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def __init__(self):self.stack = []def inorderTraversal(self, root: TreeNode) -> List[int]:if root is None:return self.stackif root.left:self.inorderTraversal(root.left)self.stack.append(root.val)if root.right:self.inorderTraversal(root.right)return self.stack

11.二叉樹(shù)的前序遍歷(根左右)

信息

給定一個(gè)二叉樹(shù),返回它的 前序 遍歷。

示例:

輸入: [1,null,2,3]
1

2
/
3

輸出: [1,2,3]
進(jìn)階: 遞歸算法很簡(jiǎn)單,你可以通過(guò)迭代算法完成嗎?

答案

class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def __init__(self):self.stack = []def preorderTraversal(self, root: TreeNode) -> List[int]:if root is None:return self.stackself.stack.append(root.val)if root.left:self.preorderTraversal(root.left)if root.right:self.preorderTraversal(root.right)return self.stack

12.二叉樹(shù)的后序排列(順序是:左右根)

信息

給定一個(gè)二叉樹(shù),返回它的 后序 遍歷。

示例:

輸入: [1,null,2,3]
1

2
/
3

輸出: [3,2,1]
進(jìn)階: 遞歸算法很簡(jiǎn)單,你可以通過(guò)迭代算法完成嗎?

答案

class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass Solution:def __init__(self):self.stack = []def postorderTraversal(self, root: TreeNode) -> List[int]:if root is None:return self.stackif root.left:self.postorderTraversal(root.left)if root.right:self.postorderTraversal(root.right)self.stack.append(root.val)return self.stack

13.使括號(hào)有效的最少添加(巧妙)

信息

給定一個(gè)由 ‘(’ 和 ‘)’ 括號(hào)組成的字符串 S,我們需要添加最少的括號(hào)( ‘(’ 或是 ‘)’,可以在任何位置),以使得到的括號(hào)字符串有效。

從形式上講,只有滿足下面幾點(diǎn)之一,括號(hào)字符串才是有效的:

它是一個(gè)空字符串,或者
它可以被寫(xiě)成 AB (A 與 B 連接), 其中 A 和 B 都是有效字符串,或者
它可以被寫(xiě)作 (A),其中 A 是有效字符串。
給定一個(gè)括號(hào)字符串,返回為使結(jié)果字符串有效而必須添加的最少括號(hào)數(shù)。

示例

示例 1:

輸入:"())"
輸出:1
示例 2:

輸入:"((("
輸出:3
示例 3:

輸入:"()"
輸出:0
示例 4:

輸入:"()))(("
輸出:4

提示:S.length <= 1000 S 只包含 '(' 和 ')' 字符。

答案

class Solution:def minAddToMakeValid(self, S: str) -> int:while '()' in S:S= S.replace('()','')return len(S)

14.二叉搜索樹(shù)迭代器

二叉搜索樹(shù)

二叉查找樹(shù)(Binary Search Tree),(又:二叉搜索樹(shù),二叉排序樹(shù))它或者是一棵空樹(shù),或者是具有下列性質(zhì)的二叉樹(shù): 若它的左子樹(shù)不空,則左子樹(shù)上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值; 若它的右子樹(shù)不空,則右子樹(shù)上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值; 它的左、右子樹(shù)也分別為二叉排序樹(shù)。

信息

實(shí)現(xiàn)一個(gè)二叉搜索樹(shù)迭代器。你將使用二叉搜索樹(shù)的根節(jié)點(diǎn)初始化迭代器。

調(diào)用 next() 將返回二叉搜索樹(shù)中的下一個(gè)最小的數(shù)。

示例:
BSTIterator iterator = new BSTIterator(root);
iterator.next(); // 返回 3
iterator.next(); // 返回 7
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 9
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 15
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 20
iterator.hasNext(); // 返回 false

提示:

next() 和 hasNext() 操作的時(shí)間復(fù)雜度是 O(1),并使用 O(h) 內(nèi)存,其中 h 是樹(shù)的高度。
你可以假設(shè) next() 調(diào)用總是有效的,也就是說(shuō),當(dāng)調(diào)用 next() 時(shí),BST 中至少存在一個(gè)下一個(gè)最小的數(shù)。

答案

class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneclass BSTIterator:def __init__(self, root: TreeNode):self.stack = []while root:self.stack.append(root)root = root.leftdef next(self) -> int:"""@return the next smallest number"""temp = self.stack.pop()res = temp.valtemp = temp.rightwhile temp:self.stack.append(temp)temp = temp.leftreturn resdef hasNext(self) -> bool:"""@return whether we have a next smallest number"""return self.stack != []

15.扁平化嵌套列表迭代器

信息

給定一個(gè)嵌套的整型列表。設(shè)計(jì)一個(gè)迭代器,使其能夠遍歷這個(gè)整型列表中的所有整數(shù)。

列表中的項(xiàng)或者為一個(gè)整數(shù),或者是另一個(gè)列表。

示例:

示例 1:

輸入: [[1,1],2,[1,1]]
輸出: [1,1,2,1,1]
解釋: 通過(guò)重復(fù)調(diào)用 next 直到 hasNext 返回false,next 返回的元素的順序應(yīng)該是: [1,1,2,1,1]。
示例 2:

輸入: [1,[4,[6]]]
輸出: [1,4,6]
解釋: 通過(guò)重復(fù)調(diào)用 next 直到 hasNext 返回false,next 返回的元素的順序應(yīng)該是: [1,4,6]。

答案

總結(jié)

以上是生活随笔為你收集整理的python 栈【测试题】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。