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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stack专题

發(fā)布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stack专题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

20 Valid Parentheses

問題:沒有意識到字符串中只包含字符:’(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’
代碼:git代碼

682 Baseball Game

問題:錯誤在+操作:top1 先彈出,top2 再彈出,還原到stack里面的時候,要先放top2,再放top1,最后放score = top1+top2;從優(yōu)秀代碼中學習到的優(yōu)點:誰說棧就只能用stack了?linkedList也可以;每種操作都優(yōu)先考慮放入棧中,再考慮加入到sum中。這是我沒有注意的,我的思考順序就很隨便了。

public int calPointsV2(String[] ops) {int sum = 0;LinkedList<Integer> list = new LinkedList<>();for (String op : ops) {if (op.equals("C")) {sum -= list.removeLast();}else if (op.equals("D")) {list.add(list.peekLast() * 2);sum += list.peekLast();}else if (op.equals("+")) {list.add(list.peekLast() + list.get(list.size() - 2));sum += list.peekLast();}else {list.add(Integer.parseInt(op));sum += list.peekLast();}} return sum;}

代碼:git代碼

496 Next Greater Element I

問題:這道題目,自己首先是理解題意有問題。對于nums1中的每個元素,先查找num2中自己(這個元素)所在位置,從右側開始查找,最近的一個比當前元素大的元素。我理解成對應的下標了。從優(yōu)先代碼學習到觀察之后能發(fā)現(xiàn)在一個遞減序列中,遇到一個大的元素,那這個元素就是這個序列中每個元素的下一個更大元素。
代碼:git代碼

735 Asteroid Collision

問題:我的問題是在寫代碼的時候沒有把if 情況合并起來,寫出來的代碼不夠簡潔。
代碼:git代碼

103 Binary Tree Zigzag Level Order Traversal

問題:遍歷節(jié)點和添加值到結果中這兩個步驟要分清楚
代碼:git代碼

144 Binary Tree Preorder Traversal

問題:if條件的位置影響程序的執(zhí)行時間
代碼:git代碼

402 Remove K Digits

問題:這道題目最后卡在了超時問題上。參考了最佳答案。原始思路是:每次刪除一位數(shù)字,得到新的最小num,再刪除,直到刪除k個數(shù)字。需要求每次刪除一位數(shù)字,如果得到最小的num:從高位開始刪除,遇到比當前最小值大的刪除操作就停止。例如1432219刪除第一位的步驟是:刪除1,得到:432219;刪除4,得到:132219;刪除3,得到142219。因為142219>132219,所以停止本次循環(huán)。接著使用132219,再刪除一位,步驟是:刪除1,得到32219;刪除3,得到12219,;刪除2得到:13219;13219 > 12219 ,所以停止本次循環(huán)。依次處理k次。時間復雜度是O(nk)。
參考代碼:看了discussion,思路是這樣的。往棧里面push元素。如果當前元素比棧頂元素小,則pop。每一次pop,k需要減1;一直到當前元素大于棧中的元素。前提條件是k>0。

public String removeKdigitsV3(String num, int k) {int digits = num.length() - k;// 最后會留下digits長度的字符char[] stk = new char[num.length()];int top = 0;// 棧的頂端for (int i = 0; i < num.length(); i++) {char c = num.charAt(i);while (top > 0 && stk[top - 1] > c && k > 0) {top -= 1;k -= 1;}stk[top++] = c;}int idx = 0;while (idx < digits && stk[idx] == '0')idx++;return idx == digits ? "0" : new String(stk, idx, digits - idx);}

代碼:代碼位置

394 Decode String

問題:看了題目之后首先想到先計算內層的[],再計算外層的[]。始終用一個變量來記錄最后的結果。分析遇到數(shù)字應該做什么,遇到[、]、字母分別應該做什么,就能得到代碼。即使思路想明白了,在代碼實現(xiàn)上一點小的區(qū)別和改動,就能得到流暢的代碼和不優(yōu)雅的代碼。看decodeStringV2和decodeStringV3的區(qū)別
代碼

385 Mini Parser

問題:本題和上一題類似,也有嵌套。區(qū)別是本題有效的全是數(shù)字。我學習到的是遞歸思路。上題分析了,找到遇到不同類型的字符時候怎么處理。還有一種是遞歸。對于:[123,[456,[789]]] ,我們可以先處理123,[456,[789]],進而可以處理:123 和 [456,[789]];對于123,直接處理轉為int;對于[456,[789]],我們可以先處理456,[789];進而分別處理456和[789]。對于[789],我們處理789。不斷遞歸,不斷縮小問題。
遞歸思想:先處理退出情況。處理不斷遞歸對結果的影響。

public NestedInteger deserializeV3(String s) {if (s.length() == 0)return new NestedInteger();if (s.charAt(0) != '[')return new NestedInteger(Integer.parseInt(s));if (s.length() <= 2)return new NestedInteger();NestedInteger res = new NestedInteger();int start = 1, cnt = 0;for (int i = 1; i < s.length(); ++i) {if (cnt == 0 && (s.charAt(i) == ',' || i == s.length() - 1)) {res.add(deserializeV3(s.substring(start, i)));start = i + 1;} else if (s.charAt(i) == '[')++cnt;else if (s.charAt(i) == ']')--cnt;}return res; }

341. Flatten Nested List Iterator

問題:把嵌套的int展開。這里也是一個遞歸思想。
代碼

331 Verify Preorder Serialization of a Binary Tree

問題:題目中說明給定的字符串是一個二叉樹先序遍歷的結果。判斷是不是一顆有效的二叉樹。這里注意兩點:1 樹的葉子節(jié)點一定是空節(jié)點;2 可能會有多余的節(jié)點。
我的思路:第一感覺是用stack。我按著操作順序走一遍,覺得自己應該能寫出代碼;發(fā)現(xiàn)寫不出來;后來我就分開訪問節(jié)點與判斷節(jié)點是否有效,寫出了第一版的代碼。寫完后發(fā)現(xiàn),因為是一顆二叉樹,所以最終就是判斷preorder[0]是不是一個有效節(jié)點就可以了。所以合并了訪問節(jié)點與判斷節(jié)點是否有效的操作。寫出來第一版的遞歸代碼。不滿意的地方是index使用了全局變量,處理得不好。
別人的代碼:所有的葉子節(jié)點是空節(jié)點,說明這顆二叉樹是一顆滿樹。二叉樹滿樹有一個特性:葉子節(jié)點數(shù)量=非葉子節(jié)點數(shù)量+1。利用二叉樹的性質。聰明。當然還有些解決方法用了入度、出度的概念,我就沒有繼續(xù)學習了。思維擴散開來就好了。
代碼

456 132 Pattern

問題:輸入int數(shù)組,判斷數(shù)組是否包含下標:i<j<k,數(shù)值a[i]<a[k]<a[j]就返回true。至于如何能想到這么解決,我想應該是題目做多了,自然就有感覺了吧。
代碼

/*** i<j<k* a[i]<a[k]<a[j]* @param nums* @return*/public boolean find132patternV3(int[] nums) {int third = Integer.MIN_VALUE;//a[k]Stack<Integer> stack = new Stack<Integer>();for(int i=nums.length - 1;i>=0;i--){//nums[i] = a[i]if(nums[i] < third){return true;}else{while(!stack.isEmpty() && nums[i] > stack.peek()){third = stack.pop();}stack.push(nums[i]);//a[j]}}return false;}

739 Daily Temperatures

問題:輸入: [73, 74, 75, 71, 69, 72, 76, 73],輸出[1, 1, 4, 2, 1, 1, 0, 0]。直觀的解決方法很簡單。兩層循環(huán),當i確認的時候,j比i大,找到第一個nums[i]<nums[j]的j,r[i] = j-i。時間復雜度是n2
學習:使用棧,幾乎是O(n)的復雜度。自己也想過放棧里面,但是想著想著就不知道怎么做了,看著別人這么做,覺得好簡單。遇到下標i,放入棧中,接著向后遍歷(因為符合條件的元素肯定在后面)。當遇到nums[i]>nums[]的情況下,就是找到答案了。當然可能多個元素,符合條件的下標都是i,所以需要循環(huán)棧。需要處理的元素放入棧,每遍歷一個元素,看這個元素是否符合棧內元素的要求。和456題有點類似。

public int[] dailyTemperaturesV2(int[] temperatures) {int[] result = new int[temperatures.length];Stack<Integer> stack = new Stack<Integer>();for(int i=0;i<temperatures.length;i++){while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]){int idx = stack.pop();result[idx] = i - idx;}stack.push(i);}return result;}

503 Next Greater Element II

問題:這是一個可循環(huán)的數(shù)組,找到每個元素下標最接近的下一個比較大的元素。這依然是一道找到較大值的題目。和上一個題目類似,用stack類解決。我的思路是先找一遍,再找一遍。循環(huán)兩次,因為畢竟是個循環(huán)數(shù)組。

public int[] nextGreaterElements(int[] nums) {int[] result = new int[nums.length];Stack<Integer> stack = new Stack<Integer>();for (int i = 0; i < nums.length; i++) {result[i] = -1;while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {result[stack.pop()] = nums[i];}stack.push(i);}for (int i = 0; i < nums.length - 1; i++) {while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {result[stack.pop()] = nums[i];}}return result;}

學習:有人總結了循環(huán)數(shù)組問題的解決思路。方法一:將原始數(shù)組擴大兩倍,當做普通問題處理。方法二:借助棧思想。就是上述代碼,只是不太優(yōu)雅。參考代碼中的nextGreaterElementsV3。
代碼

71 Simplify Path

問題:這是關于文件夾路徑簡化的問題。

總結的規(guī)律是:大小寫區(qū)分;”/字母”這是一級目錄; “/.”可以忽略 ;”/..”回退一級目錄。題目思考的思路是按照一個字符一個字符去思考。思考遇到不同類型的字符,應該做什么操作。代碼經過不斷合并if條件,得到最后的代碼。

public String simplifyPath(String path) {Stack<String> dirStack = new Stack<String>();int n = path.length();for (int i = 0; i < n; i++) {char ch = path.charAt(i);if (ch!='/') {int end = i + 1;while (end < n && path.charAt(end) !='/') {end++;}String str = path.substring(i,end);if(str.equals("..")){if(!dirStack.isEmpty()){dirStack.pop();}}else if(!str.equals(".")){dirStack.push(str);}i = (end > i + 1 ? end - 1 : i);}}String r = "";for(String dir : dirStack){r = r + "/"+dir;}return r==""?"/":r;}

學習:有人思考的角度是把字符串按/分隔后,考慮字符的有效性和無效性。代碼簡潔了很多。只是執(zhí)行速度慢了。

public String simplifyPathV2(String path) {Deque<String> stack = new LinkedList<String>();for(String str : path.split("/")){if(str.equals("..") && !stack.isEmpty()){stack.pop();}else if(!str.equals("..") && !str.equals(".") && !str.equals("")){stack.push(str);}}String r = "";for(String dir : stack){r = "/"+dir+r;}return r==""?"/":r;}

代碼

173 Binary Search Tree Iterator

問題:這是關于二分查找樹的一個遍歷器,要求實現(xiàn)hasNext方法和next方法,時間要求平均是O(1),空間要求是O(h),h是樹的高度。根據二分查找樹的定義,我們知道所有左子樹節(jié)點的值小于根節(jié)點;所有右子樹節(jié)點的值大于根節(jié)點。當next方法要求依次返回最小值的時候,我們知道肯定是先返回左子樹的值,再返回節(jié)點值,最后返回右子樹上的值。只是在實現(xiàn)的時候不能在空間要求下實現(xiàn)。
學習:思路一:用stack存儲從根節(jié)點開始的所有左節(jié)點。當next被調用的時候,直接從stack pop節(jié)點tmpNode,返回tmpNode的值。在返回之前,將tmpNode.right作為根節(jié)點再次處理存入stack。我的問題是總想弄一個curNode,想怎么在三種狀態(tài)之間切換(左子節(jié)點、當前節(jié)點值、右子節(jié)點)

public class BSTIteratorV2 {private Stack<TreeNode> stack = new Stack<TreeNode>();public BSTIteratorV2(TreeNode root) {fillStack(root);}private void fillStack(TreeNode node) {for(;node!=null;node = node.left){stack.push(node);}}/** @return whether we have a next smallest number */public boolean hasNext() {return !stack.isEmpty();}/** @return the next smallest number */public int next() {TreeNode tmpNode = stack.pop();fillStack(tmpNode.right);return tmpNode.val;} }

學習:思路二:看到一個有當前節(jié)點版本的。當前節(jié)點與要返回值的節(jié)點不是一個節(jié)點。這是重點

public class BSTIteratorV3 {private Stack<TreeNode> stack;private TreeNode cur = null;public BSTIteratorV3(TreeNode root){cur = root;stack = new Stack<TreeNode>();}public boolean hasNext() {return !stack.isEmpty() || cur !=null;}public int next(){while(cur!=null){stack.push(cur);cur = cur.left;}TreeNode node = stack.pop();//這一部是沒有想到的cur = node.right;return node.val;} }

94 Binary Tree Inorder Traversal

問題:中序遍歷二叉樹。整個解題思路與上一題目完全相同。可以實現(xiàn)一下遞歸版本與迭代版本。
代碼

總結

以上是生活随笔為你收集整理的stack专题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费看成年人视频 | 72pao成人国产永久免费视频 | 91极品在线 | 久久黄色一级视频 | 国产精品人人爽人人爽 | 丁香伊人网 | 欧美激情一二区 | 色网站入口 | 奇米影视狠狠 | 一区二区三区中文字幕在线观看 | 91喷水视频 | 黄色片的网站 | 欧美日韩国产91 | 亚洲精品视频在线播放 | 日本在线国产 | 一区二区三区伦理片 | 1024视频在线 | 免费激情 | 免费网站在线观看人数在哪动漫 | 先锋影音av资源网 | 中文字幕激情小说 | 欧美老熟妇乱大交xxxxx | 亚洲午夜福利一区二区三区 | 国产精品欧美激情在线 | 日韩不卡一区二区三区 | 日韩av免费在线看 | 午夜小网站| 日本女人一区二区三区 | 亚洲AV成人无码久久精品同性 | 美女日批在线观看 | 欧美成人免费在线观看 | 麻豆视频在线观看免费网站 | 少妇学院在线观看 | 无码少妇一区二区三区芒果 | 国产一区二区小视频 | 天堂中文在线最新 | 高跟91白丝 | 日韩精品资源 | 国产精品久久网站 | 99久久精品国产一区二区三区 | 中文字幕无码日韩专区免费 | 日韩一级二级 | 国产成人精品一区二三区 | 三上悠亚 在线观看 | 欧美色炮 | 一本久道久久综合无码中文 | 国内毛片毛片毛片毛片毛片 | 欧美1级片 | 台湾综合色 | 成人久久精品人妻一区二区三区 | 国产a一级片| 久久先锋 | 欧美日韩一区二区区 | 91视频国产免费 | 日本久久久久久久久久 | 日本成人在线免费 | 丰满少妇久久久久久久 | 亚洲熟妇一区 | 饥渴少妇伦色诱公 | 91豆花视频 | 欧美精品久久久久久久自慰 | 91在线中文字幕 | 亚洲综合一区中 | 极品国产一区 | 欧美片网站免费 | 亚洲网站一区 | 五月天色视频 | 国产在线www | 能看的毛片 | 免费网站在线高清观看 | 免费观看毛片 | 免费黄色高清视频 | 成人黄色片在线观看 | 丁香婷婷激情 | 麻豆视频黄色 | 成人福利午夜 | 91玉足脚交嫩脚丫在线播放 | hd极品free性xxx护士 | 国产在线观看一区二区三区 | 亚洲av无码成人精品区 | 激情小说中文字幕 | 五月婷婷在线视频 | 在厨房拨开内裤进入毛片 | 日韩综合一区二区三区 | 中文字幕免费观看 | 污污网址在线观看 | 天天想你在线观看完整版电影高清 | 国产三区在线视频 | 国产又粗又长又大视频 | 色射网| 超薄肉色丝袜一区二区 | 啪啪免费网址 | 国产精品久久久久久久成人午夜 | 中国一级特黄毛片 | tube极品少妇videos | 日韩久久久久久久久 | 亚洲乱熟女一区二区三区小说 | 国产免费av在线 | 麻豆成人精品国产免费 |