师姐笔试复盘(字节 9.12 测开)

1. 和师姐思路一样,,用哨兵变量存开始时间和结束时间的相关信息,set存所有的时间点,遍历即可。但是只过了30,看讨论区应该是输入超时了。
import java.util.*;

public class zj_2021_01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int max = Integer.MIN_VALUE;
        Map<Integer, Integer> start = new HashMap<>();
        Map<Integer, Integer> end = new HashMap<>();
        TreeSet<Integer> times = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            int s = sc.nextInt();
            times.add(s);
            start.put(s, start.getOrDefault(s, 0) + 1);
            int e = sc.nextInt() + s;
            times.add(e);
            end.put(e, end.getOrDefault(e, 0) + 1);
        }
        int cnt = 0;
        for (int time : times) {
            cnt += start.getOrDefault(time, 0);
            cnt -= end.getOrDefault(time, 0);
            max = Math.max(cnt, max);
        }
        System.out.println(max);
    }
}
2. 师姐没做出来,我的思路是递归判断+输出,不知道对不对,用了一个存深度的数组,依次存中序遍历相应位置的深度,假如是回文的那就是对称的树,最后直接输出。
import java.util.*;

public class zj_2021_02 {
    static HashMap<Integer, Integer> inorder_idx;
    static int[] preorder;
    static int[] inorder;
    static int[] inorder_height;
    static int max_idx = 0;
    static int n;
    static boolean flag = true;

    public static void isMirror (int preorder_left, int preorder_right, int inorder_left, int inorder_right, int height) {
        if (preorder_left > preorder_right || inorder_left > inorder_right) {
            return;
        }
        int inorder_root = inorder_idx.get(preorder[preorder_left]);
        inorder_height[inorder_root] = height;
        int other_height = inorder_height[n - 1 - inorder_root];
        if (!flag || (other_height != 0 && other_height != height)) {
            flag = false;
            return;
        }
        int left_size = inorder_root - inorder_left;
        isMirror(preorder_left + 1, preorder_left + left_size, inorder_left, inorder_root - 1, height + 1);
        isMirror(preorder_left + left_size + 1, preorder_right, inorder_root + 1, inorder_right, height + 1);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        preorder = new int[n];
        inorder = new int[n];
        inorder_height = new int[n];
        for (int i = 0; i < n; i++) {
            preorder[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            inorder[i] = sc.nextInt();
            max_idx = inorder[i] > inorder[max_idx] ? i : max_idx;
        }
        inorder_idx = new HashMap<Integer, Integer>();
        for (int i = 0; i < inorder.length; i++) {
            inorder_idx.put(inorder[i], i);
        }
        isMirror(0, n - 1, 0, n - 1, 0);
        System.out.println(flag ? inorder[n - 1- max_idx] : inorder[max_idx]);
    }
}



#字节笔试##字节跳动##笔经#
全部评论
我用的 BufferedReader ,你用 Scanner(System.in)  也超时吗?
点赞 回复 分享
发布于 2021-09-12 18:45
第一题,我也是这样做的,同 30%,分析了一波,还是不清楚哪里超时了,第一组测试用例是 30%,但不应该啊,这个算法复杂不高,怎么会超时呢。
点赞 回复 分享
发布于 2021-09-12 18:40

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
WillingLing:查看图片
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客企业服务