携程笔试 08.30 AC

笔试有点简单啊,和美团第一次笔试一样

恶心,至今没面试

第二题

题目:

y,o,u 三个字母各有 a-b-c 个数,拼接成 you,加2分;每两个连续o,加一分。问最多可以多少分

解答:

ret = min(y. o. u)

o = o - ret

if o > 0: ret=ret+o-1

第三题


题目

有一个无环图/树,每个节点可能是R或G或B。选择一条边将其删除,得到两个图,每个图都包含RGB节点。问能有几种删除方法。

解答:

有没有更好的方法呢!因为这个算是压着时间线过去的。

随机选择一个节点作为根结点(做的时候犯傻了,没必要选度为1的节点)

getColor 获得整个图 & 每个子树的RGB个数,即cnt。

checkDelete 查看每个边能否删除。

jGsZvJndZf3YEtOsn15Cdw8jeNHp3f1L.jpg
PX3BRlHsZi5juPa3sayCsXA3NE1i1tCz.jpg

第四题


题目:

长度n的数组。可以选择数组中的某一个位置更新为任意值(也可以不更新),来获得最小的 max(abs(a[1]-a[0]), abs(a[2]-a[1]), .....)。

打印最小的值。

before: 1  10000 10
after: 1 5 10 
结果:max(4, 5) = 5



解答:

比较繁琐的方法:

修改的位置有3种情况,0索引、n-1索引、其余索引。

对于其余索引 i 来说,value = 左侧sub的最大值,右侧sub的最大值,中间 arr[i-1], arr[i+1] 两者差值的一半。

左侧数组数组差值的最大值使用最大值栈来存储,右侧在遍历过程中更新rightMax就可以了。


另一种非常简单的方法是:

维护最大和第二大差值,以及他们所在的索引,然后进行处理,具体代码略。

    // 比较麻烦的办法
    public static void main4(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long arr[] = new long[n];
        for(int i = 0; i < n; i++) {
            arr[i] = sc.nextLong();
        }
        long sub[] = new long[n-1];
        for(int i = 0; i < n-1; i++) {
            sub[i] = Math.abs(arr[i] - arr[i+1]);
        }
        if(n == 2){
            System.out.println(0);
            return;
        }
        // 最大栈
        Stack<Long> s = new Stack<>();
        s.add(0L);
        for(int i = 0; i < n-1; i++) {
            s.add(Math.max(s.peek(), sub[i]));
        }
        // n-1 状态
        long rightMax = 0;
        s.pop();
        long ret = s.peek();
        // n-2 状态
        for(int i = n-2; i >= 1; i--) {
            s.pop();
            // s.peek() 左侧的最大值
            // rightMax 右侧最大值
            // 剩余中间的
            ret = Math.min(ret, Math.max(
                        Math.max(s.peek(), rightMax), 
                        (int)(Math.abs(arr[i+1]-arr[i-1]) + 1)/2));
            rightMax = Math.max(rightMax, sub[i]);
        }
        // 0 状态
        ret = Math.min(ret, rightMax);
        System.out.println(ret);
    }




#校招##笔试##携程##23届秋招笔面经#
全部评论
评论区说换的是还在考吗?是不是算作弊了?
20 回复
分享
发布于 2022-08-30 20:57 湖北
大佬第四题怎么做的?
6 回复
分享
发布于 2022-08-30 20:16 山东
滴滴
校招火热招聘中
官网直投
第三题暴力只过了31.25%
6 回复
分享
发布于 2022-08-30 20:24 福建
同求,第三题第四题好难,不会
2 回复
分享
发布于 2022-08-30 20:17 四川
第一题只过50%,有会的吗
2 回复
分享
发布于 2022-08-30 20:19 浙江
2.8有可能进面吗😅
2 回复
分享
发布于 2022-08-30 20:33 安徽
3题咋做呀
2 回复
分享
发布于 2022-08-30 20:34 辽宁
第四题我的思路是确认要改的两个i,(因为最大的gap要两个i确认)。然后针对两个i分别考虑,同时考虑左边的差和右边的差都尽可能的小,求出最小的更新自己存的gap list,再取最大值。
2 回复
分享
发布于 2022-08-30 20:53 美国
第三题用领接矩阵过了31 提示oom超空间了,结果没时间转邻接表去试了
2 回复
分享
发布于 2022-08-31 01:45 四川
3、4咋做
1 回复
分享
发布于 2022-08-30 20:18 北京
4咋做大佬
1 回复
分享
发布于 2022-08-30 20:23 黑龙江
求教第一题啊,一直过50%,去了先导0了,再变的的偶数
1 回复
分享
发布于 2022-08-30 20:34 吉林
第2题为啥只过80%
1 回复
分享
发布于 2022-08-30 21:03 重庆
第三题可以用并查集
1 回复
分享
发布于 2022-08-31 08:38 广东
大佬第四题和我想的一样,奈何我第三题只过了25
1 回复
分享
发布于 2022-08-31 09:16 吉林
第三题建树dfs,保存每个子树的abc结点数,再用全部字符串的abc总数减去当前的子树的abc个数就是另一个子树的,然后加个判断就好了
1 回复
分享
发布于 2022-09-01 11:44 黑龙江
评论区里九点前苦苦挣扎作弊的样子真好笑
1 回复
分享
发布于 2022-09-01 12:10 北京
第四题思路:1.遍历数组arr形成差分数组diff 2. 查分数组中找到绝对值最大的三个数及其位置 3. 假设第一大的数在i位置,则i位置抹平为相邻两个数的平均值,抹平后更新查分数组的diff[i] and diff[i+1] 4. 取diff[i] and diff[i+1]和第二大 第三大的最大值作为答案(注意可能第二大第三大就是i+1
1 回复
分享
发布于 2022-09-01 12:19 浙江
大佬第三题是怎么做的?
点赞 回复
分享
发布于 2022-08-30 20:17 江西
3咋做
点赞 回复
分享
发布于 2022-08-30 20:20 上海

相关推荐

点赞 评论 收藏
转发
49 132 评论
分享
牛客网
牛客企业服务