题解 | #火车进站#

火车进站

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;
        }

    }

}



全部评论
该说不说,效率是真的低这样做
点赞 回复 分享
发布于 2022-05-28 14:49
这个变量命名实际开发中估计会被老板喷死
点赞 回复 分享
发布于 2022-07-05 00:21

相关推荐

jack_miller:我给我们导员说我不在这里转正,可能没三方签了。导员说没事学校催的时候帮我想办法应付一下
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务