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


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

相关推荐

11-14 16:18
四川大学 Java
牛6646848154:眼睛有点小,建议P大点
点赞 评论 收藏
分享
我见java多妩媚:大外包
点赞 评论 收藏
分享
评论
5
14
分享
牛客网
牛客企业服务