2023 PDD 笔试

本贴最后更新于 738 天前,其中的信息可能已经沧海桑田

NO.1

A 了

/** * Description: * date: 2023/03/12 下午 7:14 * * @author Quan */ import java.util.*; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; public class Main { static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws IOException { String s = bf.readLine(); char[] str = s.toCharArray(); int n = str.length; StringBuilder sb = new StringBuilder(); int numEnd = 0; for (int i = 0, j = 0; i <= j && j < n; ) { if (isNum(str[j])) { j++; } else { numEnd = j; while (j < n && !isNum(str[j])) j++; int num = Integer.parseInt(s.substring(i, numEnd)); String c = s.substring(numEnd, j); System.out.println(num + " " + c); while (num-- > 0) sb.append(c); // 更新下表 i = j; } } System.out.println(sb); } private static boolean isNum(char c) { return (c >= '0' && c <= '9'); } }

No.2

A 了

/** * Description: * date: 2023/03/12 下午 7:20 * * @author Quan */ import java.util.*; import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; // 读取单个数字:Scanner // 读取一串字符:BufferedReader public class Main { static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); static Scanner in = new Scanner(System.in); public static void main(String[] args) throws IOException { int T = in.nextInt(), N = in.nextInt(); int[][] enermy = new int[T][N]; for (int i = 0; i < T; i++) { for (int j = 0; j < N; j++) { enermy[i][j] = in.nextInt(); } } // 贪心算法:让所有小于1的先归零,最后统计全部剩余的元素 int[] ans = new int[T]; int i = 0; for (int[] e : enermy) { // 1. 先升序排序 Arrays.sort(e); // 2. 计算 ans[i++] = attack(e); } for (int a : ans) System.out.println(a); } private static int attack(int[] e) { int a = 0; for (int i = 0; i < e.length; i++) { if (e[i] == 1) { a++; e[i] = 0; } } if (a % 2 != 0) { e[0] = 1; a--; } a /= 2; int b = 0; for (int n : e) { if (n != 0) b++; } return a + b; } }

No.3

只过了 35%。。。。

原本思路打算用贪心算法做的。。。

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; /** * Description: * date: 2023/03/12 下午 7:46 * * @author Quan */ public class Main { static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); static Scanner in = new Scanner(System.in); public static void main(String[] args) throws IOException { int N = in.nextInt(); String[] joins = new String[N]; for (int i = 0; i < N; i++) { joins[i] = in.next(); } Map<Character, int[]> map = new HashMap<>(); for (int i = 0; i < 3; i++) { int[] nums = new int[2]; nums[0] = in.nextInt(); nums[1] = in.nextInt(); map.put((char)('A' + i), nums); } // 最小花费在先 List<Map.Entry<Character, int[]>> list = new ArrayList<>(map.entrySet()); list.sort((a, b) -> { int[] na = a.getValue(); int[] nb = b.getValue(); return na[1] - nb[1]; }); // 保证先消费最省钱的,再保证消费只有一个选择的 int minSum = 0; for (int k = 0; k < list.size(); k++) { Map.Entry<Character, int[]> l = list.get(k); Character activity = l.getKey(); int nums = l.getValue()[0]; int ticket = l.getValue()[1]; //System.out.println(activity + " " + nums + " " + ticket); if (nums == 0) continue; for (int i = 0; i < joins.length; i++) { String s = joins[i]; if (s.equals("-")) continue; for (int j = 0; j < s.length(); j++) { char c = s.charAt(j); if (c == activity && nums > 0) { minSum += ticket; // 标记已完成 joins[i] = "-"; // 更新票数 l.setValue(new int[]{nums--, ticket}); break; } } } } // for (Map.Entry<Character, int[]> l : list) { // System.out.println(l.getKey() + " " + l.getValue()[0] + " " + l.getValue()[1]); // } boolean flag = false; int count = 0; for (String s : joins) { if (!s.equals("-")) { flag = true; break; } count++; } if (!flag) { System.out.println("YES"); System.out.println(minSum); } else { System.out.println("NO"); System.out.println(count); } } }

No.4

前缀和求平均数

双堆求数据流中位数

  • LeetCode 原题:295.数据流的中位数
package PDD.n04; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.PriorityQueue; import java.util.Scanner; /** * Description: * date: 2023/03/12 下午 8:33 * * @author Quan */ public class Main { static BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); static Scanner in = new Scanner(System.in); public static void main(String[] args) throws IOException { int N = in.nextInt(); int[] cus = new int[N]; for (int i = 0; i < N; i++) cus[i] = in.nextInt(); // 前缀和 int[] prefix = new int[N]; prefix[0] = cus[0]; for (int i = 1; i < N; i++) { prefix[i] = prefix[i - 1] + cus[i]; } // 1. 求平均数 for (int i = 0; i < N; i++) { if (i == 0) { System.out.print(prefix[i] + " "); continue; } double ans = Math.ceil(prefix[i] / ((i + 1) * 1.0)); System.out.print((int)ans + " "); } System.out.println(); // 2. 求中位数 MyQue que = new MyQue(); for (int n : cus) { que.addNum(n); int ans = que.getMid(); System.out.print(ans + " "); } } } class MyQue { PriorityQueue<Integer> left = new PriorityQueue<>((a, b) -> b - a); // 大根堆 PriorityQueue<Integer> right = new PriorityQueue<>((a, b) -> a - b); // 小根堆 // 确保left - right == 1 public void addNum(int num) { int leftLen = left.size(), rightLen = right.size(); if (leftLen == rightLen) { // 当right为空,或者num比右边最小值小 ---> 添加到左边 if (right.isEmpty() || num < right.peek()) { left.add(num); } else { // 当num大于等于右边最小值 ---> 先将右边的最小值移到左边,再将num加到右边 left.add(right.poll()); right.add(num); } } // 此处保证是 leftLen > rigthLen else { if (num >= left.peek()) { right.add(num); } else { // 此处rigthLen有可能为0,所以不需要判断! right.add(left.poll()); left.add(num); } } } int getMid() { if ((left.size() + right.size()) % 2 == 0) { double ans = Math.ceil((left.peek() + right.peek()) / 2.0); //System.out.println("1:" + left.peek() + " " + right.peek()); return (int)ans; } return left.peek(); } }

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...