爱奇艺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:诶,和京东无缘啦。
#笔试题目##内推##实习#