如何仅用递归函数和栈操作逆序一个栈 & 猫狗队列
如何仅用递归函数和栈操作逆序一个栈
《程序员代码面试指南》第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);
}
}

浙公网安备 33010602011771号