4.1携程Java笔试

第一题写一个sql语法分析,分析出sql中的表名,临时表不算,按最简单的sql输出了一下,11%
第二题商旅问题感觉是最优子集问题,前两天leetcode有类似的,穷举ac了,第二题默认输出-1都有27%的用例通过
第二题暴力ac
 public class Main {
    static ArrayList<List<Integer>> plans = new ArrayList<>();
    public static void main(String[] args) {
        int res = -1;
        Scanner sc = new Scanner(System.in);
        //权益数
        int n = Integer.parseInt(sc.nextLine());
        String packagesIn = sc.nextLine();
        String[] s = packagesIn.split(" ");
        ArrayList<List<Integer>> packageList = new ArrayList<>();
        //填充权益包
        for(String string:s){
            String[] vArray = string.split(",");
            ArrayList<Integer> vList = new ArrayList<>();
            for(String v:vArray){
                vList.add(Integer.parseInt(v));
            }
            packageList.add(vList);
        }
        int packageNum = s.length;
        int[] price = new int[packageNum];
        String priceIn = sc.nextLine();
        String[] ps = priceIn.split(" ");
        for(int i=0;i<packageNum;i++){
            price[i] = Integer.parseInt(ps[i]);
        }
        String valuesIn = sc.nextLine();
        String[] vs = valuesIn.split(" ");
        int[] values = new int[vs.length];
        for(int i=0;i<vs.length;i++){
            values[i] = Integer.parseInt(vs[i]);
        }
        //先穷举吧
        dfs(false,0,packageList,new ArrayList<Integer>(),values);
        if(plans.size()>0){
            for (List<Integer> plan : plans) {
                int jiage = 0;
                for (int p : plan) {
                    jiage += price[p];
                }
                if (res == -1) {
                    res = jiage;
                } else {
                    res = Math.min(res, jiage);
                }
            }
        }
        //先测测有多少-1用例嘿嘿
        System.out.println(res);
    }
    public static void dfs(boolean choosePre,int cur,List<List<Integer>> packageList,List<Integer> curChoose,int[] values){
        if(cur == packageList.size()){
            boolean allFind = !(curChoose.size()==0);
            for(int value:values){
                boolean find = false;
                for(int i=0;i<curChoose.size();i++){
                    int pIndex = curChoose.get(i);
                    List<Integer> quanyiList = packageList.get(pIndex);
                    for(int quanyi:quanyiList){
                        if(quanyi==value){
                            find=true;
                            break;
                        }
                    }
                    if(find){
                        break;
                    }else if(i==curChoose.size()-1){
                        allFind=false;
                    }
                }
            }
            //全部符合,加入计划
            if(allFind){
                plans.add(new ArrayList<Integer>(curChoose));
            }
            return;
        }
        dfs(false, cur + 1, packageList,curChoose,values);
        curChoose.add(cur);
        dfs(true,cur + 1, packageList,curChoose,values);
        curChoose.remove(curChoose.size()-1);
    }
} 

#携程##笔经#
全部评论
太难了
1 回复 分享
发布于 2021-04-01 21:11
我也是11%,不知道为什么
点赞 回复 分享
发布于 2021-04-01 21:06
直接劝退我
点赞 回复 分享
发布于 2021-04-01 21:09
第一道66 第二道54 能有面试吗😨
点赞 回复 分享
发布于 2021-04-01 21:17
我例题的“from”字符串一直找不对,后来一个一个字符的查,发现前面多了个不可见字符‘\u200B’,上网查了下才发现真是个大坑🤮
点赞 回复 分享
发布于 2021-04-01 21:18
楼主 emm 没有看明白dfs()中的  return逻辑
点赞 回复 分享
发布于 2021-04-01 21:18
第一题输入咋写的, 我用Scanner本地通过提交报异常, 用bufferreader又说超时。。
点赞 回复 分享
发布于 2021-04-01 21:20
我第一题也是11,直接放弃了,太难了
点赞 回复 分享
发布于 2021-04-01 21:22
***以为第二题最小生成树,用prim过了9%,吐血了
点赞 回复 分享
发布于 2021-04-01 21:27
看着和网易的笔试一样难,那不如试试网易?https://www.nowcoder.com/discuss/610659
点赞 回复 分享
发布于 2021-04-01 23:23
楼主 如果values 为 1 1 2 最后这个代码输出是3元
点赞 回复 分享
发布于 2021-04-02 14:36
是不是我理解不对呀
点赞 回复 分享
发布于 2021-04-02 14:37
老哥收到面试了吗
点赞 回复 分享
发布于 2021-04-04 14:14

相关推荐

评论
3
18
分享
牛客网
牛客企业服务