Loading

如何仅用递归函数和栈操作逆序一个栈 & 猫狗队列

如何仅用递归函数和栈操作逆序一个栈

题目:如何仅用递归函数和栈操作逆序一个栈

《程序员代码面试指南》第3题 P7 难度:尉★★☆☆

该题比较奇怪,也可能我理解错误,我做的思路是用一个递归函数和另一个栈,从栈顶先pop()再放入空栈,再递归取下一个(完全是莫名其妙,不过我也实在想不出来只用递归的解法)。

看了解答后,没想到要用到两个递归函数,一个用来返回栈底元素并移除,另一个用来逆序栈(该递归函数中还调用第一个递归函数)。

具体的原理及原理图见书P7-8页。

自己的代码就不贴了,做的也不对。下面是牛客网上的解答

 

猫狗队列

题目:猫狗队列

《程序员代码面试指南》第4题 P9 难度:士★☆☆☆

该题没什么技术含量,代码量还大,不做过多赘述。

我自己的思路和题解的思路差别就在于,我只用了一个总的队列来保存猫和狗,而题解则分了猫队列和狗队列,并且对猫和狗作进一步封装,加上时间戳count),通过时间戳来区分猫和狗加入队列的先后顺序。核心在于pollAll(),通过判断count来选择输出猫还是狗。

此外,我一开始每一步操作都直接sout输出结果。然后提交运行后发现,运行超时了。看了讨论区后才发现:

表示真的学到了,以后频繁输出的时候可以先全部存到StringBuilder里,最后一次性输出。

(注意:每次append()方法一定要加换行,不然最后输出就是连在一起的一行)

具体代码见猫狗队列题解

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
 
public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        String[] str = reader.readLine().split(" ");
        reader.close();
        Stack<Integer> stack = new Stack<>();
        for (int i = n - 1; i >= 0; i--) {
            stack.push(Integer.parseInt(str[i]));
        }
        reverse(stack);
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pop()).append(" ");
        }
        System.out.println(sb);
    }
    private static int getAndRemoveLastElement(Stack<Integer> stack) {
        int result = stack.pop();
        if (stack.isEmpty()) {
            return result;
        } else {
            int last = getAndRemoveLastElement(stack);
            stack.push(result);
            return last;
        }
    }
    private static void reverse(Stack<Integer> stack) {
        if (stack.isEmpty()) {
            return;
        }
        int i = getAndRemoveLastElement(stack);
        reverse(stack);
        stack.push(i);
    }
}

 

posted @ 2021-10-29 13:37  幻梦翱翔  阅读(54)  评论(0)    收藏  举报