猿辅导2020校招编程题-1

记录校招编程题

题目1

题意:每个字符串由A-Z,数字0-9和()组成表示一个压缩后的串,保证输入数据一定合法且字符串长度小于50。输出一个展开后的字符串
输入:(YUANFUDAO)2JIAYOU
输出:YUANFUDAOYUANFUDAOJIAYOU

package jan2;
// question https://www.nowcoder.com/test/question/done?tid=30052014&qid=808489#summary
// reference https://blog.csdn.net/qq_17550379/article/details/98597843
/**
 * 每个字符串由A-Z,数字0-9和()组成表示一个压缩后的串,保证输入数据一定合法且字符串长度小于50。
 * 输出一个展开后的字符串
 * (YUANFUDAO)2JIAYOU -> YUANFUDAOYUANFUDAOJIAYOU
 */
public class P1 {
    int index = 0;

    private String solve(String str) {
        return dfs("(" + str + ")");
    }

    private String dfs(String str) {
        StringBuilder res = new StringBuilder();
        while(index < str.length()) {
            if(str.charAt(index) == '(') {
                index++;
                res.append(dfs(str));
            }
            else if(str.charAt(index) == ')') {
                index++;
                return res.toString();
            }
            else if(Character.isDigit(str.charAt(index))) {
                int num = 0;
                while(index < str.length() && Character.isDigit(str.charAt(index))) {
                    num = num * 10 + str.charAt(index++) - '0';
                }
                String tmp = res.toString();
                for(int i = 0; i < num - 1; i++) res.append(tmp);
            }
            else {
                res.append(str.charAt(index++));
            }
        }
        return res.toString();
    }

    public static void main(String[] args) {
        P1 p = new P1();
        String str = "(YUANFUDAO)2JIAYOU";
        System.out.println(p.solve(str));
    }
}

题目2

题意:有一个N*M大小的迷宫矩阵,迷宫的每一个格子有一个数值(a[i][j]<10^9)。小猿在迷宫中发现,它只能朝着上下左右四个方向的相邻格子前进,并且只能进入比当前位置数值更大的格子。但是小猿有个紧急呼救按钮,他可以通过按下按钮,强行进入到不满足条件的相邻格子,可惜按钮只能按K次。请问小猿从这个迷宫任选一个格子出发,在紧急呼救按钮的帮助下,最多可以走多少步(开始位置计入步数,即站在起点是步数为1)。

package jan2;

/**
 * 有一个N*M大小的迷宫矩阵,迷宫的每一个格子有一个数值(a[i][j]<10^9)。小猿在迷宫中发现,
 * 它只能朝着上下左右四个方向的相邻格子前进,并且只能进入比当前位置数值更大的格子。但是小猿
 * 有个紧急呼救按钮,他可以通过按下按钮,强行进入到不满足条件的相邻格子,可惜按钮只能按K次。
 * 请问小猿从这个迷宫任选一个格子出发,在紧急呼救按钮的帮助下,最多可以走多少步(开始位置计入步数,即站在起点是步数为1)。
 */
public class P2 {

    private int solve(int[][] matrix, int k) {
        if(matrix.length == 0 || matrix[0].length == 0) return 0;

        int m = matrix.length, n = matrix[0].length;
        int res = 1;
        int[][][] dp = new int[m][n][k + 1];

        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                res = Math.max(res, dfs(matrix, dp, i, j, k));
            }
        }
        return res + 1;
    }

    int[][] dirs = new int[][]{{0, -1}, {0, 1}, {1, 0}, {-1, 0}};
    private int dfs(int[][] matrix, int[][][] dp, int i, int j, int k) {
        if(dp[i][j][k] != 0) return dp[i][j][k];
        int m = matrix.length, n = matrix[0].length;
        int t = 0;
        for(int[] dir : dirs) {
            int x = i + dir[0], y = j + dir[1];
            if (x >= 0 && x < m && y >= 0 && y < n) {
                if (matrix[x][y] > matrix[i][j]) t = Math.max(t, dfs(matrix, dp, x, y, k) + 1);
                else if(matrix[x][y] <= matrix[i][j] && k > 0) t = Math.max(t, dfs(matrix, dp, x, y, k - 1) + 1);
            }
        }
        dp[i][j][k] = t;
        return t;
    }

    public static void main(String[] args) {
        int[][] m = new int[][]{{1,3,3}, {2,4,6}, {8,9,2}};
        P2 p = new P2();
        System.out.println(p.solve(m, 1));
    }
}

题目3

题意:K(K>=3)个猿辅导的老师们在玩一个击鼓传花的小游戏,每击一次鼓,拿着花的老师要将花交给别人,不能留在自己手中。游戏开始前花在小猿手中,求击鼓N次后,这朵花又回到小猿手中的方案数,请输出这个数的模1e9+7。

package jan2;

/**
 * K(K>=3)个猿辅导的老师们在玩一个击鼓传花的小游戏,每击一次鼓,拿着花的老师要将花交给别人,
 * 不能留在自己手中。游戏开始前花在小猿手中,求击鼓N次后,这朵花又回到小猿手中的方案数,
 * 请输出这个数的模1e9+7。
 */

public class P3 {
    private int solve(int n, int k) {
        int[][] dp = new int[2][2];
        int mod = 1000000007;
        int flag = 1;
        dp[0][0] = 1;
        for(int i = 0; i < n + 1; i++) {
            dp[flag][0] = dp[1-flag][1] % mod;
            dp[flag][1] = dp[1-flag][1]*(k-2) % mod + dp[1-flag][0]*(k-1) % mod;
            flag = 1-flag;
        }
        return dp[1-flag][0] % mod;
    }

    public static void main(String[] args) {
        P3 p = new P3();
        System.out.println(p.solve(3, 3));
    }
}

猜你喜欢

转载自www.cnblogs.com/xlsryj/p/12133279.html