荣耀 8.10 笔试 一二题参考题解
第一题 报文转换 题解
通过用例100%
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine().trim();
String[] arr = str.split(" ");
int n = arr.length;
ArrayList list = new ArrayList();
for (int i = 1; i < n; i++) {
if (arr[i].equals("A") || arr[i].equals("a")) {
list.add("12");
list.add("34");
} else if (arr[i].equals("B") || arr[i].equals("b")) {
list.add("AB");
list.add("CD");
} else {
list.add(arr[i].toUpperCase());
}
}
StringBuilder sb = new StringBuilder();
// 此处要转16进制,且16进制要大写
// 只通过20%用例的话,可能这里出问题了
System.out.print(Integer.toHexString(list.size() + 1).toUpperCase());
for (int i = 0; i < list.size(); i++) {
System.out.print(" ");
System.out.print(list.get(i));
}
System.out.println();
}
}
第二题 会议室 题解
通过用例100%
先排序,再动态规划
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
while (t-- > 0) {
int n = in.nextInt();
int[][] times = new int[n][2];
for (int i = 0; i < n; i++) {
times[i][0] = in.nextInt();
times[i][1] = in.nextInt();
}
System.out.println(solution(times));
}
}
static int solution(int[][] nums) {
Arrays.sort(nums, Comparator.comparingInt(o -> o[0]));
int[] dp = new int[24];
for (int[] meeting : nums) {
int start = meeting[0], end = meeting[1];
for (int i = 23; i >= end; --i) {
dp[i] = Math.max(dp[start] + end - start, dp[i]);
}
}
return dp[23];
}
}
第二题解法2:
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
while (t-- > 0) {
int n = in.nextInt();
int[][] times = new int[n][2];
for (int i = 0; i < n; i++) {
times[i][0] = in.nextInt();
times[i][1] = in.nextInt();
}
System.out.println(solution(times));
}
}
static int solution(int[][] times) {
Arrays.sort(times, Comparator.comparingInt(o -> o[1]));
// System.out.println(Arrays.deepToString(times));
int n = times.length;
int[] prev = new int[n];
Arrays.fill(prev, -1);
// prev数组 维护的是 第i个区间前面与之不相交的最近的区间的下标
for (int i = n - 1; i >= 1; i--) {
int start = times[i][0];
for (int j = i - 1; j >= 0; j--) {
if (times[j][1] <= start) {
prev[i] = j;
break;
}
}
}
System.out.println(Arrays.toString(prev));
int[] opt = new int[n];
for (int i = 0; i < n; i++) {
int start = times[i][0], end = times[i][1];
// 当前区间 选 或 不选 两种情况,取最大值
opt[i] = Math.max(end - start + getOPT(opt, prev[i]), getOPT(opt, i - 1));
}
return opt[n - 1];
}
static int getOPT(int[] opt, int idx) {
if (idx == -1) return 0;
return opt[idx];
}
}解法2的参考学习资料在这里
