题解 | #火车进站#
火车进站
http://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
//傻瓜级教学
//接收正整数 n
//做个一n长度的数组
//循环n次,每次装一个扫描器读到的数给索引
//这个数组做待入站的容器,按照索引入站,
//做一个linkedlist 当车站
//做一个String类装出站的车的序号,
//入站push 索引下移,String对象不变
//出站pop,索引不变,string对象加入pop()(为什么用string类?方便后面字典序排列)
//做一个集合装string类,
//主方法调用方法m()
//集合做好了,就sort,然后循环
//方法m() 递归思想,参数重设自我调用,出口
//当车站为空,待入站火车数组不为空,只能压
//当车站不空,待入站火车数组为空时,只能弹
//当车站空,待入站火车数组也为空时,结束
//其他情况(车站不空,待入站火车数组不空)
//其他情况下的后续操作有两种情况1.压 2.弹(弹一辆,到全弹完,这里我想着是循环的,后来发现不对,调用自己就行了,上一次是弹,下一次还是有两种情况,弹和压)
//这时候就要拷贝一组除了装string集合以外的所有容器了,一组压,一组弹
//字典序???? 将一个方案的所有数字组成一个数字,然后不同的方案从小到大排列
import java.util.*;
public class Main{
public static void main(String []args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []isdcz=new int [n];
for(int i=0;i<n;i++){
isdcz[i]=sc.nextInt();
}
LinkedList<Integer> llhcz=new LinkedList<>();
String sycz="";
ArrayList<Integer> al = new ArrayList<>();
al=m(isdcz,0,llhcz,sycz,al);
al.sort(Comparator.naturalOrder());
for(int i:al){
String s=i+"";
char[] cs = s.toCharArray();
for (char c:cs){
System.out.print(c+" ");
}
System.out.println();
}
}
public static ArrayList<Integer> m(int []isdcz, int i,LinkedList<Integer> llhcz,String sycz,ArrayList<Integer> al){
//dcz空,llhcz空,结束,遍历当前arraylist,重置这个jh
if(i==isdcz.length-1+1&&llhcz.isEmpty()){
al.add(Integer.parseInt(sycz));
sycz="";
return al;
//dcz空,llhcz不空,只能弹
}else if(i==isdcz.length-1+1&&!llhcz.isEmpty()){
sycz=sycz+llhcz.pop();
return m(isdcz,i,llhcz,sycz,al);
//dcz不空,llhcz空,只能压,索引往下取
}else if(i!=isdcz.length-1+1&&llhcz.isEmpty()){
llhcz.push(isdcz[i]);
return m(isdcz,i+1,llhcz,sycz,al);
//其他情况,两个都不空,能压也能弹,这时候要复制容器
}else{
int[]isdcz2=new int [isdcz.length];
for(int xh=0;xh<isdcz.length;xh++){
isdcz2[xh]=isdcz[xh];
}
LinkedList<Integer> llhcz2=new LinkedList<>();
for(int xh=0;xh<llhcz.size();xh++){
llhcz2.add(llhcz.get(xh));
}
String sycz2=new String(sycz);
//原来那一组弹
sycz=sycz+llhcz.pop();
al=m(isdcz,i,llhcz,sycz,al);
//新的那组压
llhcz2.push(isdcz[i]);
al=m(isdcz2,i+1,llhcz2,sycz2,al);
return al;
}
}
}