记录校招编程题
题目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));
}
}