携程4月1日笔试编程题部分代码

题目忘了拍了。。。大家找一找网上应该有的
第一题暴力O(N^2)超时,只过了40%,蹲一波大佬们的AC代码。
第二题二维dp过了88%,显示,WA不知道哪里有问题,代码如下:
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.nextLine());
        int m = Integer.parseInt(sc.nextLine());
        int p = Integer.parseInt(sc.nextLine());
        Set<Integer> birth = new HashSet<>();
        for(int i = 0;i < p;i++){
            birth.add(Integer.parseInt(sc.nextLine()));
        }
        int x = Integer.parseInt(sc.nextLine());
        int[][] dp = new int[x + 1][m + 1];
        dp[0][0] = n;
        for(int i = 1;i <= x;i++){
            if(dp[i][m] > 0){
                dp[i][m] -= dp[i - m - 1][0];
            }
            for(int j = 1;j <= m;j++){
                dp[i][j] += dp[i - 1][j - 1];
                if(birth.contains(j)) {
                    dp[i][0] += dp[i][j];
                }
            }

        }
        int res = 0;
        for(int i = 0;i <= m;i++){
            res += dp[x][i];
        }
        System.out.println(res);
    }
}
第三题编辑距离问题,牛客有原题,本来以为会很复杂,结果直接遍历字典就AC了。。。
public class Main {
    public static void main(String[] args){
        String[] d = {"surprise", "happy", "ctrip", "travel", "wellcome","student","system","program","editor"};
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String str = sc.nextLine();
            boolean flag = true;
            for(String s : d){
                if(change(str,s) <= 2){
                    System.out.println(s);
                    flag = false;
                    break;
                }
            }
            if(flag){
                System.out.println("null");
            }
        }
    }
    private static int change(String s1,String s2){
        int[][] dp = new int[s1.length()][s2.length()];
        for(int i = 0;i < s1.length();i++){
            dp[i][0] = i;
        }
        for(int i = 0;i < s2.length();i++){
            dp[0][i] = i;
        }
        for(int i = 1;i < s1.length();i++){
            for(int j = 1;j < s2.length();j++){
                dp[i][j] = Math.min(dp[i - 1][j] + 1,
                        Math.min(dp[i][j - 1] + 1,
                                dp[i - 1][j - 1] + (s1.charAt(i) == s2.charAt(j) ? 0 : 1)));
            }
        }
        return dp[s1.length() - 1][s2.length() - 1];
    }
}
感觉我就这水平了,希望有个面试吧



#携程#
全部评论
题目很简单,本地也都能过,每次我都死在调试赛码输入输出上面,一拿到上面就不能过,我真的是佛
点赞 回复 分享
发布于 2020-04-01 21:04
第一题leetcode253会议室II
点赞 回复 分享
发布于 2020-04-01 21:05
第一道用string确实会超时,但把string还成stringbuilder就能ac
点赞 回复 分享
发布于 2020-04-01 21:06
海豚那个是long吧
点赞 回复 分享
发布于 2020-04-01 21:06
第三题牛客原题目名是啥?
点赞 回复 分享
发布于 2020-04-01 21:36
借楼,请问大家这种解法是否可行?     public static int dfsSolution(int n, int m, int[] birthYear, int x){         if(birthYear==null || birthYear.length==0)             return x>m?0:n;         //for later O(1) find         HashSet<Integer> set=new HashSet<>();         for(int b: birthYear){             set.add(b);         }         return dfs(n,m,set,0,0, x);     }     public static int dfs(int n, int m, HashSet<Integer> set, int cur_year, int age, int x){         if(cur_year>=x) {             if(age<=m){                 return set.contains(age)?2*n:n;             }             return 0;         }         if(age>m)             return 0;         //if it is in the birth year         if(set.contains(age)){             //这一批海豚今年会生n个宝宝,从0岁开始算.另开一个分支计算             return dfs(n,m,set,cur_year+1,age+1, x)+dfs(n,m,set, cur_year+1,1,x);         }         return dfs(n,m,set,cur_year+1,age+1, x);     }
点赞 回复 分享
发布于 2020-04-02 03:34
楼主过了吗,我a了两道半没过
点赞 回复 分享
发布于 2020-04-09 21:32

相关推荐

1 5 评论
分享
牛客网
牛客企业服务