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