爱奇艺2018春招Java工程师编程题题解
字典序最大子序列
题目描述
对于字符串a和b,如果移除字符串a中的一些字母(可以全部移除,也可以一个都不移除)就能够得到字符串b我们就称b是a的子序列。
例如."heo"是"hello"的子序列,而"xl"不是。
对于给定的一个字符串s,请计算出s的字典序最大的子序列。
输入描述:
输入包括一行,一个字符串s,字符串a长度Length(1 <= 1ength <= 50).s中每个字符都是小写字母
输出描述:
输出一个字符串,即a的字典序最大的子序列。
示例
输入
test
输出
tt
代码实现
package aiqiyi.demo1; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String str = scanner.next(); char[] charArray = str.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()); } }
三个整数
题目描述
牛牛有三个整数X, Y, Z.牛牛现在要使用若干次操作让X, Y, Z变为
相等,每次操作牛牛有两种操作类型可选
操作1:从X, Y, Z中选择两个数,都加1
操作2:从X, Y, Z中选择一个数,加2
牛牛已经证明了使用若干次这两种操作一定可以让三个整数变为
相等,请你帮他计算一下最少需要多少次操作.
输入描述:
输入包括三个整数A, B, C(0 < A , B , C < 100)。
输出描述:
输出一个整数,表示最少需要的操作次数.
示例
输入
2 5 4
输出
2
代码实现
package aiqiyi.demo2; import java.util.Arrays; import java.util.Scanner; public class Main { 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); if ((arr[2] - arr[1] + arr[2] - arr[0]) % 2 == 0) { System.out.println((arr[2] - arr[1] + arr[2] - arr[0]) / 2); } else { System.out.println((arr[2] - arr[1] + arr[2] - arr[0] + 3) / 2); } } }
牛牛配糖果
题目描述
牛牛有n种糖果,每种糖果都有足够多,现在牛牛想用这些糖果组成一些糖果盒.
每个糖果盒内放m个糖果,对于一个糖果盒牛牛希望第种糖果的数量不能少于li颗,也不能多于ri颗.
满足条件的糖果盒组成方案可能会有很多,牛牛希望你帮他计算一共有多少种糖果盒的拼凄方案.
对于两种方案,当有任意一种糖果个数不同,就视为两种不同方案.
输入描述:
输入包括n+1行。 第一行包括两个正整数(1<=n<= 20, 1<=m<= 100),表示糖果的种数和一盒糖果盒的糖果个数。 接下来的n行,每行两个整数li, ri(0< li< ri <= 10),表示第i种糖果的数量限制上下限。
输出描述:
输出一个整数,表示满足限定条件的方案数。保证答案在64位整数范围内。
示例
输入
3 5 0 3 0 3 0 3
输出
12
代码实现
package aiqiyi.demo3; import java.util.Scanner; public class Main { 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[] rem = new int[n];// 表示每一种颜色剩余可以加的 for (int i = 0; i < r.length; i++) { l[i] = scanner.nextInt(); r[i] = scanner.nextInt(); least += l[i]; rem[i] = r[i] - l[i]; } int target = m - least; 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 <= rem[i - 1]; k++) { if (j - k >= 0) dp[i][j] += dp[i - 1][j - k]; } } } System.out.println(dp[n][target]); } }