記錄校招編程題
題目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));
}
}
