题解 | #火车进站#

火车进站

http://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109

当还有火车还未进站时,可以选择进站;
当站中有火车时,可以选择让最外面的火车出站;
二者互不影响;
可以使用回溯算法来进行模拟:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()){
            //思路:如果栈中有元素就可以选择是否弹出,如果还有火车未进站,就可以选择进站,二者互不影响
            int n = sc.nextInt();
            List<Integer> list = new ArrayList<>();
            List<List<Integer>> res = new ArrayList<>();
            Deque<Integer> stack = new LinkedList<>();
            int[] nums = new int[n];
            for(int i=0;i<n;i++){
                nums[i] = sc.nextInt();
            }
            //StringBuilder sb = new StringBuilder();
            dfs(stack,nums,0,list,res);
            Set<String> set = new TreeSet<>();
            for(List<Integer> ls : res){
                StringBuilder sb = new StringBuilder();
                for(Integer i : ls){
                    sb.append(i+" ");
                }
                set.add(sb.toString());
            }
            for(String s : set){
                System.out.println(s);
            }
        }
    }
    public static void dfs(Deque<Integer> stack,int[] nums,int m,List<Integer> list,List<List<Integer>> res){
        if(m==nums.length && stack.isEmpty()){
            //将一条记录添加到集合中
            List<Integer> tmp = new ArrayList<>(list);
            res.add(tmp);
            return;
        }
        //如果还有火车尚未入栈,可以入栈
        if(m<nums.length){
            stack.push(nums[m]);
            dfs(stack,nums,m+1,list,res);
            //回溯
            stack.pop();
        }
        //如果栈中有元素可以出栈
        if(!stack.isEmpty()){
            int a = stack.pop();
            list.add(a);
            dfs(stack,nums,m,list,res);
            //回溯
            stack.push(a);
            list.remove(list.size()-1);
        }
    }
}
全部评论

相关推荐

秋招投简历提醒助手:个人经验是,一般面二十场左右就会进入侃侃而谈阶段。我今年七月末的时候开始的第一次面试,都是很多不会,回复很慢。后面慢慢迭代,到九月中的时候基本上面啥说啥,很放松的状态
远程面试的尴尬瞬间
点赞 评论 收藏
分享
StephenZ_:我9月份找的第一段实习也是遇到这种骗子公司了,问他后端有多少人和我说7个正职,进去一看只有一个后端剩下的都是产品前端算法(没错甚至还有算法)。还是某制造业中大厂,我离职的时候还阴阳怪气我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务