师姐笔试复盘(字节 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]);
    }
}



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

相关推荐

程序员卤馆:加v细说
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客企业服务