恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经,目前已更新至美团、微软…
作者@TechGuide【全网同名】
点赞再看,养成习惯,您动动手指对原创作者意义非凡🤝
第一题:大小端字节流解析(100分)
题目描述
在计算机系统内存在两种字节序:大端和小端
大端(Big Endian) 就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
小端(Little Endian) 就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
以数字0x12345678为例:
大端(Big Endian) 低地址到高地址依次为"0x120x340x56|0x78"
小端(Little Endian) 低地址到高地址依次为"0x7|0x56|0x340x12"
现定义一种字符编码,其编码格式如下:
9个字符为一个编码组
第一个字符表示后续8个字符的字节序(字符’0’表示小端,字符’1’表示大端),后续8个字符,每个字符代表一个字节
编码解析之后字符串采用大端模式
例如编码组"012345678",解析之后的大端字符串为"87654321",编码组"12345678",解析之后的大端字符串为"12345678"
现输入一个数字和一个字符串,数字表示字符串中有多少组编码,需要解析并打印解析后的字符串,具体要求如下:
- 按编码组出现的顺序(从左至右)打印一行结果
- 解析之后的结果为大端模式
- 每个编码组的结果以一个空格分隔
- 行末无空格
输入描述
第一行为数字n,表示后续输入的字符串有多少个编码组
第二行为编码字符串
2
0abcdefqh1abcdefgh
输出描述
输出为一行,包含N个编码组解析结果(大端模式),每个结果以一个空格分隔,行末无空格
hafedcba abcdefgh
思路
模拟
代码
JAVA版本
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = 0;
in.nextLine();
String[] res = new String[n];
String line = in.nextLine();
char[] sc = line.toCharArray();
int mode = sc[0] - '0';
int st = 0;
for (int i=0; i<=sc.length; ++i) {
if (i == sc.length || i%9==0 && i != 0) {
// st+1 .. i!
String sub = new String(sc, st+1, i - st - 1);
res[k++] = mode == 1 ? sub : new StringBuilder(sub).reverse().toString();
if (i < sc.length) mode = sc[i] - '0';
st = i;
}
}
System.out.println(String.join(" ", res));
}
}
// vx公众号关注TechGuide 实时题库 闪电速递
第二题:视频会议室使用时长最大化(200分)
题目描述
公司2楼有一个视频会议室,会议室的使用由秘书进行安排,每个使用会议的小组都会发送会议使用时间(startend)给秘书,时间用24小时制表示,会议最早开始时间8点,最晚23点结束;会议都是整数小时,上一场会议的结束时间和下一场会议的开始时间可以相同,不考虑会议的重要紧急程度,会考虑会议延迟,作为秘书安排会议的原则就是让会议室的使用时间最长。
输入描述
输入一个数字T,表示有T组测试数据;每个测试数据输入一个数字n(1<n<=100),表示几场会议;然后紧跟着n行数字对,每行分别表示会议开始和会议结束
1
6
15 17
8 11
10 16
11 12
13 15
9 12
输出描述
输出会议室最长使用时间,每组样例输出最终结果,并且单独占用一行
8
思路
DP,dp[i] 表示 8…i 区间内所有安排方案中,占用会议室时长的最大值
代码
JAVA版本
import java.util.*;
public class Main {
static int func(int[][] arr) {
int n = arr.length;
// 8 .. 23
int[] dp = new int[24];
for (int i=8; i<=23; ++i) {
int max = 0;
for (int j=n-1; j>=0; --j) {
if (arr[j][1] <= i) {
int t = arr[j][1] - arr[j][0] + dp[arr[j][0]];
max = Math.max(max, t);
}
}
dp[i] = max;
}
return dp[23];
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 8..23
int T = sc.nextInt();
for (int _i=0; _i<T; ++_i) {
int n = sc.nextInt();
int[][] arr = new int[n][];
for (int i=0; i<n; ++i) {
arr[i] = new int[] {sc.nextInt(), sc.nextInt()};
}
int res = func(arr);
System.out.println(res);
}
}
}
// vx公众号关注TechGuide 实时题库 闪电速递
第三题:仓库出租公司(300分)
题目描述
仓库出租公司遇到了一个特殊的客户,该客户有如下要求:
- 共有M个货物需要存放,每个货物占用的空间可能是不同的;
- 需要提供两个仓库来存放这些物品,而且这两个仓库必须是同型号的,即两个仓库的容量规格是相同的
你作为仓库出租公司的技术人员,请问提供的每个仓库容量规格至少为多少,才能把该客户的所有货物都存放进去?
输入描述
输入共两行
- 第一行为一个正整数M,表示货物的个数:
- 第二行为M个正整数,分别对应M个货物的占用空间大小,这M个整数并未经过排序。 M的最大值为1000;所有货物占用空间的总和最大值为50000。
3
17811
输出描述
输出一个整数,表示为了存放所有货物,仓库至少应达到的容量规格
19
说明:
共3个货物,占用空间分别为17,8,11。
最少需要提供两个容量均为19的仓库,一个存储11,另一个存储17和8,这样才能将所有货物全部装下。
思路
二分+DP,二分仓库容量k,然后用DP判断k是否可以满足条件。 dp[i][j] 表示前 i 个数中是否存在和为 j 的组合,在遍历最后一层判断即可。
代码
import java.util.*;
import java.io.*;
public class Main {
static boolean chk(int k, int[] arr, int sum) {
int n = arr.length;
boolean[][] dp = new boolean[n+1][k+1]; // 前i个数中存在和为 j 的组合
for (int i=0; i<=n; ++i) dp[i][0] = true;
for (int i=1; i<=n; ++i) {
for (int j=1; j<=k; ++j) {
boolean t = dp[i-1][j];
if (j-arr[i-1] >= 0) t = (t || dp[i-1][j-arr[i-1]]);
dp[i][j] = t;
if (t && j <= k && sum - j <=k) return true;
}
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
int sum = 0;
for (int i=0; i<n; ++i) {
arr[i] = sc.nextInt();
sum += arr[i];
}
int l = sum / 2, r = sum;
while (l < r) {
int mi = l + (r - l) / 2;
if (chk(mi, arr, sum)) r = mi;
else l = mi + 1;
}
System.out.println(l);
}
}
// vx公众号关注TechGuide 实时题库 闪电速递