4.16携程笔试 2.25/4
第一题
static void solve() throws IOException { String str = in.nextLine(); // 贪心 char[] s = str.toCharArray(); int n = s.length; int res = 0; for (int i = 0; i < n; i++) { if (i + 1 < n && s[i] == 'y' && s[i + 1] == 'u') { res++; } } out.println(res); }
第二题
static void solve() throws IOException { // 贪心 int n = in.nextInt(); int[] a = new int[n], b = new int[n], c = new int[n]; Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < n; i++) { a[i] = in.nextInt(); } for (int i = 0; i < n; i++) { b[i] = in.nextInt(); } for (int i = 0; i < n; i++) { c[i] = in.nextInt(); map.merge(c[i], 1, Integer::sum); } int res = 0; for (int i = 0; i < n; i++) { int key = a[i] + b[i]; if (map.getOrDefault(key, 0) > 0) { res++; map.merge(key, -1, Integer::sum); } } out.println(res); }
第三题 5%
感觉应该是 dp
static final int MX = 1000005; static boolean[] isPrime = new boolean[MX]; static { Arrays.fill(isPrime, true); isPrime[0] = false; isPrime[1] = false; for (int i = 2; i < MX; i++) { if (isPrime[i]) { for (int j = i * i; j > 0 && j < MX; j += i) { isPrime[j] = false; } } } } static void solve() throws IOException { // 贪心 分析:2 + 3 可以得到素数 5 多一次机会 2 + 5 可以得到素数 7 多一次机会 1 不是素数 // dp int n = in.nextInt(); int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i] = in.nextInt(); } int pre = a[0], res = n; for (int i = 1; i < n; i++) { if (isPrime[pre] && isPrime[a[i]] && isPrime[pre + a[i]]) { pre = pre + a[i]; res--; continue; } if (i + 1 < n && isPrime[a[i + 1]] && isPrime[a[i]] && isPrime[a[i + 1] + a[i]]) { pre = a[i + 1] + a[i]; i++; res--; continue; } if (isPrime[pre] && isPrime[a[i]]) { pre = pre + a[i]; res--; continue; } pre = a[i]; } out.println(res); }
第四题 20%
不会反向建图 求dis数组是O(n^2) 超时了
dis[n + 1][2]记录每个节点出发到达叶子节点的最长距离和次长距离
static void solve() throws IOException { // 分析:需要的信息,从每个节点出发到达叶子节点的最长距离和次长距离 int n = in.nextInt(); List<Integer>[] g = new ArrayList[n + 1]; root = new int[n + 1]; root[1] = 0; Arrays.setAll(g, e -> new ArrayList<Integer>()); for (int i = 0; i < n - 1; i++) { int u = in.nextInt(), v = in.nextInt(); g[u].add(v); g[v].add(u); } for (int i = 1; i <= n; i++) { int[][] dis = new int[n + 1][2]; dis[i] = dfs(i, -1, g, dis); if (dis[i][0] == 0 || dis[i][1] == 0) { out.println(dis[i][0] + dis[i][1] + 1); } else { out.println(dis[i][0] + dis[i][1]); } } } private static int[] dfs(int x, int fa, List<Integer>[] g, int[][] dis) { // 正向遍历 记录父结点 同时反向建图 if (g[x].size() == 1 && g[x].get(0) == fa) { return dis[x]; } for (int child : g[x]) { if (child == fa) continue; int[] info = dfs(child, x, g, dis); if (info[0] + 1 > dis[x][0]) { dis[x][1] = dis[x][0]; dis[x][0] = info[0] + 1; } else if (info[0] + 1 > dis[x][1]) { dis[x][1] = info[0] + 1; } } return dis[x]; }#携程##笔试##Java##实习#