如何僅用遞迴函式和棧操作逆序一個棧 & 貓狗佇列
阿新 • • 發佈:2021-10-29
如何僅用遞迴函式和棧操作逆序一個棧
《程式設計師程式碼面試指南》第3題 P7 難度:尉★★☆☆
該題比較奇怪,也可能我理解錯誤,我做的思路是用一個遞迴函式和另一個棧,從棧頂先pop()再放入空棧,再遞迴取下一個(完全是莫名其妙,不過我也實在想不出來只用遞迴的解法)。
看了解答後,沒想到要用到兩個遞迴函式,一個用來返回棧底元素並移除,另一個用來逆序棧(該遞迴函式中還呼叫第一個遞迴函式)。
具體的原理及原理圖見書P7-8頁。
自己的程式碼就不貼了,做的也不對。下面是牛客網上的解答
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.util.Stack; 5 6 public class Main{ 7 public static void main(String[] args) throws IOException { 8 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 9 int n = Integer.parseInt(reader.readLine()); 10 String[] str = reader.readLine().split(" "); 11 reader.close(); 12 Stack<Integer> stack = new Stack<>(); 13 for (int i = n - 1; i >= 0; i--) { 14 stack.push(Integer.parseInt(str[i])); 15 } 16 reverse(stack); 17 StringBuilder sb = new StringBuilder(); 18 while(!stack.isEmpty()){ 19 sb.append(stack.pop()).append(" "); 20 } 21 System.out.println(sb); 22 } 23 private static int getAndRemoveLastElement(Stack<Integer> stack) { 24 int result = stack.pop(); 25 if (stack.isEmpty()) { 26 return result; 27 } else { 28 int last = getAndRemoveLastElement(stack); 29 stack.push(result); 30 return last; 31 } 32 } 33 private static void reverse(Stack<Integer> stack) { 34 if (stack.isEmpty()) { 35 return; 36 } 37 int i = getAndRemoveLastElement(stack); 38 reverse(stack); 39 stack.push(i); 40 } 41 }
貓狗佇列
題目:貓狗佇列
《程式設計師程式碼面試指南》第4題 P9 難度:士★☆☆☆
該題沒什麼技術含量,程式碼量還大,不做過多贅述。
我自己的思路和題解的思路差別就在於,我只用了一個總的佇列來儲存貓和狗,而題解則分了貓佇列和狗佇列,並且對貓和狗作進一步封裝,加上時間戳(count),通過時間戳來區分貓和狗加入佇列的先後順序。核心在於pollAll(),通過判斷count來選擇輸出貓還是狗。
此外,我一開始每一步操作都直接sout輸出結果。然後提交執行後發現,執行超時了。看了討論區後才發現:
表示真的學到了,以後頻繁輸出的時候可以先全部存到StringBuilder裡,最後一次性輸出。
(注意:每次append()方法一定要加換行 ,不然最後輸出就是連在一起的一行)
具體程式碼見貓狗佇列題解