爱奇艺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:诶,和京东无缘啦。
#笔试题目##内推##实习#
全部评论
我想说。。我没搞懂最大字典序的子序列是什么意思。。迷
点赞 回复 分享
发布于 2018-04-19 21:12
#include <iostream> using namespace std; int main(void) { int max, A, B, C, diff; cin >> A >> B >> C; max = A; if (B > max) max = B; if (C > max) max = C; diff = max * 3 - A - B - C; if (diff % 2 == 1) cout << (diff + 3) / 2; else cout << diff / 2; return 0; } HTML 编辑器好像代码输出来是一行,换成 markdown 试试...
点赞 回复 分享
发布于 2018-04-19 21:19
阿里云
校招火热招聘中
官网直投
老铁你发的代码怎么老是一行的 2333
点赞 回复 分享
发布于 2018-04-19 21:04
尴尬
点赞 回复 分享
发布于 2018-04-19 21:05
你这样写第二题A了?***考虑的情况跟我一样啊 为啥我就50%?
点赞 回复 分享
发布于 2018-04-19 21:11
第三题思路dp是什么
点赞 回复 分享
发布于 2018-04-19 21:13
第一什么思路
点赞 回复 分享
发布于 2018-04-19 21:14
第二题好像只要判断两种情况:最后是 +2 的或者最后是 +1+1的..我这么写就 AC 了 #include <iostream> using namespace std; int main(void) {     int max, A, B, C, diff;     cin >> A >> B >> C;     max = A;     if (B > max) max = B;     if (C > max) max = C;     diff = max * 3 - A - B - C;     if (diff % 2 == 1) cout << (diff + 3) / 2;     else cout << diff / 2;     return 0; } //别问我为什么选 Java 岗写 C++ 代码...
点赞 回复 分享
发布于 2018-04-19 21:16
第一题到底要求输出什么啊我没看懂题目
点赞 回复 分享
发布于 2018-04-19 21:16
第二题 else{                 System.out.println(sum1 + sum2 / 2+ 2);             } 是什么意思呢
点赞 回复 分享
发布于 2018-04-19 21:33
第三题能讲讲吗
点赞 回复 分享
发布于 2018-04-19 21:42
第三题,牛逼
点赞 回复 分享
发布于 2018-04-19 22:27
过了80%有成绩吗?
点赞 回复 分享
发布于 2018-04-19 22:29
在哪里看过了80%是什么原因导致的?
点赞 回复 分享
发布于 2018-04-19 22:30
第三题啥意思了,没看懂
点赞 回复 分享
发布于 2018-04-19 22:46
爱奇艺实习生,马上要走了,东家还是很不错的
点赞 回复 分享
发布于 2018-04-20 01:07
老哥你太厉害了,可惜京东不问算法
点赞 回复 分享
发布于 2018-04-20 11:27
选择题全对,编程题只会一道,能进面试吗
点赞 回复 分享
发布于 2018-04-20 14:23
第一题。。可以用单调栈只用o(n)复杂度
点赞 回复 分享
发布于 2018-04-20 16:13

相关推荐

理智的马里奥不愿再收感谢信:这小米咱是非去不可了是吗?
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
点赞 57 评论
分享
牛客网
牛客企业服务