猿輔導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));
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM