栈的压入、弹出序列
尝试一
结果:case通过率为0.00%
code:
import java.util.ArrayList;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
/*特殊情况处理*/
if(pushA.length!=popA.length || pushA.length==0 || popA.length==0){
return false;
}
int length=pushA.length;
for(int i=0;i<length;++i){
if(pushA[length-i-1]!=popA[i]){
return false;
}
}
return true;
}
}
test case:
不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%
用例:
[1,2,3,4,5],[4,5,3,2,1]
对应输出应该为:
true
你的输出为:
false
分析:我以为是一直压,然后在一直弹。没想到可以压到一半的时候,就可以弹,然后在继续压。
尝试二
结果:答案正确:恭喜!您提交的程序通过了所有的测试用例
code:
import java.util.ArrayList;
public class Solution {
private boolean find=false;
public boolean IsPopOrder(int [] pushA,int [] popA) {
/*特殊情况处理*/
if(pushA.length!=popA.length || pushA.length==0 || popA.length==0){
return false;
}
ArrayList<Integer> stack=new ArrayList<>();
ArrayList<Integer> popRecord=new ArrayList<>();
find(0,pushA,popA,true,(ArrayList<Integer>)stack.clone(),(ArrayList<Integer>)popRecord.clone());
return find;
}
/*
* i:当前处理的元素
* pushA:压入的元素
* popA:目标弹出序列
* op:弹/压,压为true,弹为false
* stack:当前弹出序列
* popRecord:记录弹出序列
*/
private void find(int i,int[] pushA,int[] popA,boolean isIn,ArrayList<Integer> stack,ArrayList<Integer> popRecord){
if(isIn==true){
/*递归结束标识*/
if(i>=pushA.length){
return ;
}
stack.add(pushA[i]);
}
if(isIn==false){
if(stack.size()<=0){
orderEq(popA,popRecord.toArray());
return;
}
popRecord.add(stack.get(stack.size()-1));
stack.remove(stack.size()-1);
}
//压
find(i+1,pushA,popA,true,(ArrayList<Integer>) stack.clone(),(ArrayList<Integer>) popRecord.clone());
//弹
find(i,pushA,popA,false,(ArrayList<Integer>) stack.clone(),(ArrayList<Integer>) popRecord.clone());
}
/*比较两个数组序列是否相等*/
private void orderEq(int [] a,Object []b){
if(a.length!=b.length){
return ;
}else{
int length=a.length;
for(int i=0;i<length;++i){
Integer t= (Integer) b[i];
if(a[i]!=t){
return ;
}
}
find= true;
}
}
}
思路:用递归试探的思路。
结论
- Arrays.asList()
- 递归传入参数时,注意参数为引用类型时,递归函数中要改变参数的值。
- 递归是有些参数,返回值根本不变。不如直接把他们存为实例变量。这样便于使用且避免代码复杂。
- 想要拷贝一个对象,可以调用它的clone方法(注意可能需要强制类型转换)