携程java后端 4.15 笔试

建房子

第一个月建一个红“R"房子,后面的每一个月在新建的房子左边建一个绿"G"房子右边见一个"R"房子
输入:N个月
输出:N个月后街道上的房子排列

例子:
输入:1
输出:R

输入:2
输出:GRR

输入:3
输出:GGRRGR

    static String buildingHouse(String n) {
        int N = 1;
        try {
            N = Integer.parseInt(n);
        } catch (NumberFormatException e) {
            return "N";
        }
        if (N < 1 || N > 12) {
            return "O";
        }
        return build(N, "R");
    }

    static String build(int round, String H) {
        if (round == 1) {
            return H;
        }
        String ret = build(round-1, "G") + H + build(round-1, "R");
        return ret;
    }

递归就完事了,和建括号差不多

找被污染的包

输入:第一行是被污染的包,后面的所有行是包的依赖关系,2,3,6表示2依赖于3和6
输出:找出所有受到影响的包的和

例子:
输入:
4
1,2
2,3,6
3,4,5,6
6,2,4
8,9
10

输出:12
受影响的是1,2,3,6加起来为12

邻接表BFS

import java.util.*;

public class Ctrip2 {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int source = cin.nextInt();
        cin.nextLine();
        HashMap<Integer, LinkedList> graph = new HashMap<>();
        while (cin.hasNextLine()) {
            String[] line = cin.nextLine().split(",");
            int N = line.length;
            int[] int_line = new int[N];
            for (int i=0; i < N; i++) {
                int_line[i] = Integer.parseInt(line[i]);
            }
            int influenced = int_line[0];
            for (int i=1; i < N; i++) {
                int key = int_line[i];
                LinkedList<Integer> link = graph.getOrDefault(key, new LinkedList<Integer>());
                link.add(influenced);
                graph.put(key, link);
            }
        }

        System.out.println(sumPollutants(graph, source));
    }

    public static int sumPollutants(HashMap<Integer, LinkedList> graph, int src) {
        if (!graph.containsKey(src)) {
            return -1;
        }
        Queue<Integer> q = new LinkedList<>();
        HashSet<Integer> visited = new HashSet<>();
        q.offer(src);
        visited.add(src);
        while (!q.isEmpty()) {
            int size = q.size();
            for (int i=0; i < size; i++) {
                int curr = q.poll();
                if (!graph.containsKey(curr)) {
                    continue;
                }
                LinkedList<Integer> children = graph.get(curr);
                for (Integer child: children) {
                    if (visited.contains(child)) {
                        continue;
                    }
                    q.offer(child);
                    visited.add(child);
                }
            }
        }
        int sum = 0;
        for (Integer v: visited) {
            sum += v;
        }
        return sum - src;
    }
}
#笔试题目##携程#
全部评论
第一题我竟然傻乎乎的建了个二叉树,然后中序遍历解得
2 回复
分享
发布于 2021-04-15 21:56
本地必须要设置结束符才可以我调试了好久才发现这个
1 回复
分享
发布于 2021-04-15 21:46
阅文集团
校招火热招聘中
官网直投
楼主都a过了吗
点赞 回复
分享
发布于 2021-04-15 21:28
楼主, 第二题while (cin.hasNextLine())这里读取完最后一组数据是会被阻塞住的啊,你是怎么通过的呢?我在本地运行你的代码输出不了结果
点赞 回复
分享
发布于 2021-04-15 21:43
这题可以用动态规划解决,两个数组 ,一个将出现的结点存在数组中,另一个dp数组用来查找存对应结点的子节点sum,未找到赋值为0,时间复杂度o(n^2),可有优化成o(n),用哈希表存结点,查找效率更快
点赞 回复
分享
发布于 2021-04-16 00:17
楼主你好,请问你是实习、校招还是社招?
点赞 回复
分享
发布于 2021-04-16 09:07
楼主收到面试通知了没
点赞 回复
分享
发布于 2021-04-17 14:04

相关推荐

6 13 评论
分享
牛客网
牛客企业服务