爱奇艺Java笔试题解
//最大字典子序列
//解题思路:例如一个字符串asdfghj,我们首先需要遍历一遍字符串,找到字典排序最大的s,
//然后接下来遍历dfghj,找到最大的j。此时j是最后一个字符,
//搜索结束,字典排序最大的子字符串即为sj。
public class AiQYI {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String inputStr = scanner.next();
char[] charArray = inputStr.toCharArray();
int maxPos = 0;//记录最大的字符所在的位置
StringBuffer sb = new StringBuffer();
while (maxPos < charArray.length) {
int maxVlue = Integer.MIN_VALUE;//记录本次遍历得到的最大字符
for (int i = maxPos; i < charArray.length; i++) {
if (charArray[i] > maxVlue) {
maxVlue = charArray[i];
maxPos = i;
}
}
sb.append((char) maxVlue);
maxPos++;
}
System.out.println(sb.toString());
}
}
第二题:三个整数
思路:贪心,首先对三个数进行排序。从小到大为xyz,
①如果xy之间差距为偶数,通过对x+2就使得xy相等,然后,对xy分别+1,使得xyz相等。
②如果 xy之间为奇数,那么就通过对xy分别+1,使得y=z,此时如果x和Z之间差距为偶数,那么就对x加2,使得XYZ相等
③如果x和Z之间差距为奇数,那么就x加2,使得X比zy都大1,然后对yz分别加1,使xyz相等 。
假设为2 5 8,那么由②可以变为 5 8 8,然后根据③,变化为 9 8 8,然后变化为 9 9 9。
public class AiQYI2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] arr = new int[3];
for (int i = 0; i < arr.length; i++) {
arr[i] = scanner.nextInt();
}
Arrays.sort(arr);
int x = arr[0], y = arr[1], z = arr[2];
if ((y - x) % 2 == 0) {
System.out.println((y - x) / 2 + z - y);
} else {
int sum1 = z - y;
int sum2 = z - x - sum1;// x使用了1,1以后和Z的差值
if (sum2 % 2 == 0) {
System.out.println(sum1 + sum2 / 2);
} else {
System.out.println(sum1 + sum2 / 2 + 2);
}
}
}
}
第三题:配糖果
多重背包,首先将需要取得Li放入盒子中,假设所有的Li的和为least,那么我们还需要对盒子添加m-least个糖果。
我们假设 avaliable[i] = r[i] - l[i];表示在已经对盒子放入各种最小糖果的情况下,还能继续添加的糖果数。
此时问题就变的简单了,在容量为m-least的背包中,我们可以选择放入的物品的容量为avaliable[i],请问有多少种装满背包的情况?
这就是一个多重背包的问题。
public class AiQYI3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 颜色种类
int m = scanner.nextInt();// 盒子放置m个糖果
int[] l = new int[n];
int[] r = new int[n];
int least = 0;
int[] avaliable = new int[n];// 表示每一种颜色剩余可以加的
for (int i = 0; i < r.length; i++) {
l[i] = scanner.nextInt();
r[i] = scanner.nextInt();
least += l[i];
avaliable[i] = r[i] - l[i];
}
int target = m - least; //dp[i][j]表示前i种糖果装满容量为j的背包的方法数。一定要用long,不然会爆,只能过70% long[][] dp = new long[n + 1][target + 1];
for (int i = 0; i < dp.length; i++) {
dp[i][0] = 1;//初始化
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= target; j++) {
for (int k = 0; k <= avaliable[i - 1]; k++) {
if (j - k >= 0)
dp[i][j] += dp[i - 1][j - k];
}
}
}
System.out.println(dp[n][target]);
}
}
等会9.30面京东,所有解题思路需要等一会。
22.48:诶,和京东无缘啦。
#笔试题目##内推##实习#
查看19道真题和解析
深信服公司福利 749人发布