携程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
楼主收到面试通知了没
点赞 回复 分享
发布于 2021-04-17 14:04
楼主你好,请问你是实习、校招还是社招?
点赞 回复 分享
发布于 2021-04-16 09:07
这题可以用动态规划解决,两个数组 ,一个将出现的结点存在数组中,另一个dp数组用来查找存对应结点的子节点sum,未找到赋值为0,时间复杂度o(n^2),可有优化成o(n),用哈希表存结点,查找效率更快
点赞 回复 分享
发布于 2021-04-16 00:17
楼主, 第二题while (cin.hasNextLine())这里读取完最后一组数据是会被阻塞住的啊,你是怎么通过的呢?我在本地运行你的代码输出不了结果
点赞 回复 分享
发布于 2021-04-15 21:43
楼主都a过了吗
点赞 回复 分享
发布于 2021-04-15 21:28

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
评论
6
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务