9-8日 携程 开发岗第二题 代码详解

九月八日的携程JAVA开发岗,真的太难了

当是只做出了AC 88%第一题,现在补充 第二题的代码。有错误的地方希望大家纠正,先看下题目
思想讲解:
这个题目其实主要考的是笛卡尔积,先使用笛卡尔积的算法,把所有的可能都得到,再去判断是否出现重复流程
有错误的地方请指正
别觉得代码多 ,重点代码只在 fun(), main方法里只是做了 输入 输出 ,判断是否为重复流
import java.util.*;

public class demo2 {
    static StringBuilder res = new StringBuilder();
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()){
            String str = scanner.nextLine(); //输入
            String strs[] = str.split(" ");  //根据空格截取每一段
            List<List<String>> lists = new ArrayList<>();
            for (int i = 0; i < strs.length; i++) {
                lists.add(Arrays.asList(strs[i].split("")));
            }
            Stack<String> stack = new Stack<>();
            List<List<String>> result = new ArrayList<>();
            fun(lists,0,stack,result);
//  假设数据为 [[a,b,c],[d,c,f]]  ,那么sets[0] 所存储的就是 a,b,c,  sets[1] 所存储的就是 a,b,c,d,f
//            作用是为了判断流程中是否包含重复流程
//                采用这种结构是为了降低复杂度,如果在两层循环中再嵌套一个 for循环去判断是否有重复流,那时间复杂度一下子就上去了。但是借助了set之后,就可以把第三层循环干掉
            ArrayList<HashSet<String>> sets = new ArrayList<>();
            HashSet<String> set = new HashSet<>();
            for (int i = 0; i < lists.size(); i++) {
                for (int j = 0; j < lists.get(i).size(); j++) {
                    set.add(lists.get(i).get(j));
                }
                sets.add(new HashSet<>(set));
            }
            Boolean flag = false; //判断是否出现重复
            for (int i = 0; i < result.size(); i++) {
                flag = false;
                for (int j = 0; j < result.get(i).size(); j++) {
                    String s=  result.get(i).get(j);
                    if(j!=0&&sets.get(j-1).contains(s)){ //判断是否出现重复
                        flag = true;
                    }
                    System.out.print(s);
                }
                if (flag){
                    System.out.print("--重复流程");
                }
                System.out.println();
            }
        }
    }

    /**
     *
     * @param originLists   原始的一个二维数组
     * @param index    遍历二维数组的一位数组的位置   [[a,b,c],[d,e,f]]   index == 0 表示 [a,b,c]
     * @param stack    用于存储每次得到的结果 ,[a,d] 就是其中一个,
     *                 先将a入栈,d再入栈,然后d出栈,e入栈,e出栈,f入栈,f出栈,
     *                 此时,def都遍历完了,那么此时就应该是a出栈,b入栈 ,重复上面的操作
     * @param result  存储得到的结果集
     * @param <T>     泛型
     */
    public static <T> void fun(List<List<T>> originLists,int index,Stack<T> stack,List<List<T>> result){
        List<T> list = originLists.get(index);  //获得原始数组中的其中一个数组元素
        for (int i = 0; i < list.size(); i++) { //遍历list中的每个元素
            stack.push(list.get(i));   //遍历得到的元素压入栈中
            if(index == originLists.size()-1){//表明已经到达了原始数组的最后一个元素,也表明了,当前stack为其中一个子集
                List<T> res = new ArrayList<>(stack);  //生成新的数组,存入结果集中
                result.add(res);  //将结果存入result集合中
                stack.pop();  //出栈栈顶元素
                continue;
            }
            fun(originLists,index+1,stack,result); //递归调用
            stack.pop();  //出栈栈顶元素
        }
    }
}



#笔试题目##携程#
全部评论

相关推荐

关于我大学本科四年,想了很多,但还是不知道该怎么动笔&nbsp;“大学四年,是我从懵懂少年走向职场青年的转折期。这一路跌跌撞撞,有迷茫,有遗憾,也有成长和决心。”&nbsp;大一刚进来时仍然有高中那股学习劲,经常一个人去图书馆学高等数学,但后面劲头一过便开始在宿舍开启躺平生活(现在想想那段时间真的很爽,无忧无虑)。由于大一担任班干部,所以经常要跟其他班的班干部交流,在此期间认识了隔壁班的一位女生,短发而很可爱,因为很多团建还有比赛都是我们两班一起参加的,而且我和她都是负责人,所以交集很多,后面慢慢地彼此对产生了好感,所以在大一刚开学的2个月后,我们在一起了,彼此之前都是初恋。但当时我真的是太太太直男了,对感情的想...
真烦好烦真烦:骗哥们可以,别把你自己也骗到了就行。哥们被你骗了真无所谓的,打个哈哈就过了。但希望你打完这段话后擦一下眼角,别让眼泪掉在手机屏幕上了就行。你说的这些话,哥们信一下也是没什么的。还能让你有个心里安慰,但这种话说出来骗骗兄弟就差不多得了,哥们信你一下也不会少块肉,但是你别搞得自己也当真了就行。哥们被你骗一下是真无所谓的,兄弟笑笑也就过去了。真不是哥们想要破你防,你擦擦眼泪好好想想,除了兄弟谁还会信你这些话?
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
我知道自己这个念头不好,但是真的很羡慕😭大家的父母长辈都能帮到自己吗?
大飞的诡术妖姬:父母都是普通打工人,身体也不好,能供我读到本科毕业很不容易,毕业以后帮衬心里会有罪恶感。虽然可能会错过很多风景,但还是想活的心安理得。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务