5.27携程笔试后台开发2道算法题

感觉题目不是很难,应该是在原题上进行修改的变种题,不过我都没AK😅,只做出了0.8+1,许愿有个面试机会吧!(春招到现在一个offer都没有,我太难了

t1:火车站中转方案
思路:建图,dfs搜索到终点y,去掉x,y首尾节点,路径经过的点个数不超过k就将路径节点序列化成字符串放到set去重即可,同时要注意不能访问相同的节点
这题有ac的大佬欢迎评论区讨论一下解法🤩
package xiecheng.t1;

import java.util.*;

public class Main {
    static Set<String> set;
    static int x, y;
    static boolean[] vis;

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        String str = in.nextLine();
        String[] arr = str.split(" ");
        List<Integer>[] link = new ArrayList[n + 1];
        vis = new boolean[n + 1];
        for (int i = 1; i <= n; i++) {
            link[i] = new ArrayList<>();
        }
        int len = arr.length;
        for (int i = 0; i < len; i++) {
            String[] split = arr[i].split(",");
            link[Integer.parseInt(split[0])].add(Integer.parseInt(split[1]));
        }
        x = in.nextInt();
        y = in.nextInt();
        int k = in.nextInt();
        set = new HashSet<>();
        vis[x] = true;
        dfs(x, k, link, new ArrayList<Integer>() {{
            add(x);
        }}, "" + x);
        System.out.println(set.size());
    }

    static void dfs(int cur, int k, List<Integer>[] link, List<Integer> list, String str) {
        if (cur == y && list.size() > 1 && list.size() - 2 <= k) {
            //System.out.println(str);
            set.add(str);
            return;
        }
        for (int j = 0, siz = link[cur].size(); j < siz; j++) {
            if (vis[link[cur].get(j)]) continue;
            vis[link[cur].get(j)] = true;
            list.add(link[cur].get(j));
            dfs(link[cur].get(j), k, link, list, str + link[cur].get(j));
            list.remove(list.size() - 1);
            vis[link[cur].get(j)] = false;
        }
    }
}
t2:最小子序列
思路:类似力扣原题76题吧,用双指针做即可。
package xiecheng.t2;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    static int winner(int[] s, int[] t) {
        Map<Integer, Integer> cnt1 = new HashMap<>();
        Map<Integer, Integer> cnt2 = new HashMap<>();
        int kind = 0, num;
        for (int i = 0; i < t.length; i++) {
            num = cnt1.getOrDefault(t[i], 0);
            if (num == 0) kind++;
            cnt1.put(t[i], num + 1);
        }
        int lt = 0, rt = 0, len = s.length, curKind = 0;
        int res = len + 1, startIndex = 0;
        while (true) {
            while (rt < len && curKind < kind) {
                num = cnt2.getOrDefault(s[rt], 0);
                if (cnt1.getOrDefault(s[rt], 0) == num + 1) curKind++;
                cnt2.put(s[rt], num + 1);
                rt++;
            }
            if (curKind < kind) break;
            if (rt - lt < res) {
                res = rt - lt;
                startIndex = lt;
            }
            num = cnt2.getOrDefault(s[lt], 0);
            if (cnt1.getOrDefault(s[lt], 0) == num) curKind--;
            cnt2.put(s[lt], num - 1);
            lt++;
        }
        return res == len + 1 ? 0 : startIndex + 1;
    }


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int res;
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String[] values = line.split(",");
        int[] s = new int[values.length];
        for (int i = 0; i < values.length; i++) {
            s[i] = Integer.parseInt(values[i]);
        }
        line = scanner.nextLine();
        values = line.split(",");
        int[] t = new int[values.length];
        for (int i = 0; i < values.length; i++) {
            t[i] = Integer.parseInt(values[i]);
        }
        res = winner(s, t);
        System.out.println(res);
    }
}


#笔经##携程##笔试题目#
全部评论
第一题 用bellman_ford一直60%
点赞 回复 分享
发布于 2021-05-27 22:13
第二题中的  t序列是不是不用去重啊?我看你写的是按照出现频率找的
点赞 回复 分享
发布于 2021-05-27 22:06
第一题用dfs不会超时啊。不知道你dfs为啥写了这么多代码。。
点赞 回复 分享
发布于 2021-05-27 21:48

相关推荐

qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
04-25 18:13
五邑大学 Java
后来123321:大二两段实习太厉害了,我现在大二连面试都没有
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-29 22:21
Offer1:小马智行,深圳,测试开发工程师,17.0k*16.0,Offer2:追觅科技,深圳,嵌入式工程师,18.0k*15.0,
嵌软狗都不学:各位base深圳的同事,作为也是并肩作战的一员,今天想站在管理视角,和大家开诚布公地聊一聊:从近几个月的上下班数据对比看来,我们发现一个明显的差异:深圳同事的在岗时间普遍比苏州同事短。很多深圳同事早上9点之后才到公司,晚上不到 20 点就下班了;而总部那边,20点半甚至 22 点后还有不少同事在办公室忙碌,特别是研发团队,加班更是常态。相信去过苏州的同事,对这种场景都不陌生。我很好奇,这是因为苏州工作任务太重还是咱们深圳同事效率真的高到能在更短时间内完成工作?MOVA在深圳成立分公司是为了吸引更优秀的人才贡献更多更高质的价值,公司管理层给我反馈的是深圳招到的多是行业的专家大拿,大部分都是薪资比苏州高的,而且我们办公的租金等也远高于苏州的..MOVA虽脱胎于强壮的集团母体不久,各业务板块尚未实现全面盈利,虽说公司管理层目光长远,不纠结当下的人才投入,但行业内的普遍标准是,员工创造的价值要达到公司雇佣成本的 15 倍以上。大家不妨自我审视一下,自己是否达到了这个标准?如果是抱着划水、按时打卡走人拿毛爷爷的心态那不适合来MOVA,那样过下去不但自己过得尴尬也会影响MOVA这个大船的攻城略地的速度.我并非鼓励大家盲目加班,而是倡导高效工作,拒绝无效忙碌,不要让项目进度因低效受影响,也别把精力浪费在和苏州同事拼打卡时长上,提倡更高的人效比;考虑到两地地域和交通差异,相信大家会找最适合自己发挥的工作方式(比如按时下班后1小时到家晚饭后继续未竟工作等..)大家在遵守公司规章的情况下尽情地体现自己的能力价值,为MOV!和深圳公司争光我们在这边才能更安心更有信心的工作下去;请客BU长、名部门长、项目管理和各业务单元负责人,全面梳理团队情况,及时评估成员工作负荷与成果质量,坚决清退划水害虫痕疫,践行公司价值观,相互监督,防止管理漏洞及渎职。感谢人家的理解,也请人家多担待我的直言不讳……
点赞 评论 收藏
分享
评论
5
14
分享

创作者周榜

更多
牛客网
牛客企业服务