爱奇艺2017校园招聘笔试题

时间:2022-10-01 19:20:04

成长值计算
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
爱奇艺累计有2000万会员,为了提高会员权益以及减少运营成本,我们需要对用户分等级差异化运营,为此我们制定了用户成长体系,按成长值(最小为0)划分为不同等级。成长值计算公式为:
会员成长值=每天成长值+任务成长值
现在我们输入一组数据,表示用户的成长值计算规则,比如某个用户的每天成长值规则1 1 5 10,第一列1表示每日成长值规则,第二列1表示该条规则的生效开始时间,第三列5表示该条规则的生效截至时间,第四列10表示该条规则的每天成长值,则用户初始值为0,第1天到第5天,每天成长值10点,则第5天成长值为50;另外任务成长值规则,比如2 3 4,第一列2表示该规则为任务成长值,第二列3表示第三天做任务,第三列4表示该天做任务得到成长值4。现在输入一组数据,每行一条成长规则,每日成长规则生效时间重合时以成长数值最大的为准,每日成长值是每天0点更新,任务成长值是0点以后,要求计算成长值规则对应最后一天成长值。
输入
输入数据有多行,第一列为1时,该行会有4个数值,第一列为2时,该列会有3个数值
输出
对于每个测试实例,初始成长值都为0,计算成长值规则最后一天的用户成长值。

样例输入
1 1 5 10
2 3 4
1 4 6 -5
样例输出
49

import java.util.Scanner;

public class Main {

    public static void main(String[] arg) {
        Scanner scan = new Scanner(System.in);
        int[] arr = new int[1002];
        int[] tasks = new int[1002];
        int lastDay = 0;
        while (scan.hasNext()) {
            String input = scan.nextLine();
            String[] strs = input.split(" ");
            if (strs.length == 4) {
                int start = Integer.parseInt(strs[1]);
                int end = Integer.parseInt(strs[2]);
                int value = Integer.parseInt(strs[3]);
                for (int i = start; i <= end; i++) {
                    if (arr[i] != 0) {
                        arr[i] = arr[i] > value ? arr[i] : value;
                    }else {
                        arr[i] = value;
                    }
                }
                lastDay = lastDay > end ? lastDay : end;
            }else {
                int time = Integer.parseInt(strs[1]);
                int value = Integer.parseInt(strs[2]);
                tasks[time] = value;
                lastDay = lastDay > time ? lastDay : time;
            }
        }
        System.out.println(solve(arr,tasks,lastDay));
        scan.close();
    }

    private static long solve(int[] arr, int[] tasks,int lastDay) {
        long ans = 0;
        for (int i = 0; i <= lastDay; i++) {
            ans += arr[i];
            ans += tasks[i];
        }
        return ans;
    }

}

相似单词变换
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
英文单词有很多非常相似,比如:see和seek、cat和cut等,现在提供3种编辑操作:insert、remove、replace,通过在单词1上进行这些操作,可以让单词1变成单词2
那么问题来了,如何只用最小次数的编辑操作,可以让字符串1变成字符串2?
说明:
1)3种编辑操作的代价是一样的
2)并且每次只能操作一个字符串的一个字母
3)只需要考虑在字符串1上进行编辑操作即可
输入
输入一行,有两个字符串,以空格分隔。
输出
输出为最小编辑次数。

样例输入
geek gesek
样例输出
1

import java.util.Scanner;

public class Main {

    public static void main(String[] arg) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String str = scan.nextLine();
            String[] ss = str.split(" ");
            System.out.println(solve(ss[0],ss[1]));
        }
        scan.close();
    }

    private static int solve(String stra, String strb) {
        int lena = stra.length();
        int lenb = strb.length();
        int[][] dp = new int[lena+1][lenb+1];
        char[] cha = stra.toCharArray();
        char[] chb = strb.toCharArray();
        dp[0][0] = 0;
        for(int i=1;i<=lena;i++){
            dp[i][0]=dp[i-1][0]+1;
        }
        for(int i=1;i<=lenb;i++){
            dp[0][i]=dp[0][i-1]+1;
        }
        for(int i=1;i<=lena;i++){
            for(int j=1;j<=lenb;j++){
                if(cha[i-1]==chb[j-1]){
                    dp[i][j]=dp[i-1][j-1];
                }else{
                    dp[i][j]=getMin(dp[i][j-1]+1,dp[i-1][j]+1,dp[i-1][j-1]+1);
                }
            }
        }
        return dp[lena][lenb];
    }

    private static int getMin(int a, int b, int c) {
        return Math.min(Math.min(a,b),c);
    }
}