猿辅导前两题
第一题:
import java.util.Stack;
public class Partion1 {
public static void main(String[] args) {
// Scanner sc = new Scanner(System.in);
// String s = sc.nextLine();
// int n = Integer.parseInt(s);
// Partion1 partion1 = new Partion1();
// String[] res = new String[n];
// for(int i=0;i<n;i++){
// String s1 = sc.nextLine();
// res[i]=partion1.partion(s1);
// }
// for(int i=0;i<n;i++){
// System.out.print(res[i]);
// if(i!=n-1){
// System.out.println();
// }
//
// }
// 5
//A11B
//(AA)2A
//((A2B)2)2G
//(YUANFUDAO)2JIAYOU
//A2BC4D2
Partion1 partion1 = new Partion1();
System.out.println(partion1.partion("(AA)2A"));
}
private String partion(String s){
if(s==null||s.length()==0) return "";
Stack<String> stack = new Stack<>();
for(int i=0;i<s.length();){
char c = s.charAt(i);
if(c=='('){
stack.add("(");
}else if(c==')'){
//合并( 与)之间的字符串,以便后面出现数字重复
StringBuffer buffer = new StringBuffer();
String pop1 = stack.pop();
while(!("(".equals(pop1))){
buffer.insert(0,pop1);
pop1 = stack.pop();
}
stack.add(buffer.toString());
}else if(Character.isDigit(c)){
//读取多位数字
int index = i+1;
while(index<s.length()&&Character.isDigit(s.charAt(index))){
index++;
}
int n = Integer.parseInt(s.substring(i,index));
//重复多次字符串
String s1 = stack.pop();
StringBuffer stringBuffer = new StringBuffer();
for(int k=0;k<n;k++){
stringBuffer.append(s1);
}
stack.add(stringBuffer.toString());
i= index-1;
}else {
stack.add(String.valueOf(c));
}
i++;
}
if(stack.isEmpty()){
return "";
}else {
StringBuffer sb = new StringBuffer();
int size = stack.size();
for(int i=0;i<size;i++){
sb.insert(0,stack.pop());
}
return sb.toString();
}
}
}
第二题:
import java.util.Arrays;
import java.util.Scanner;
public class Partion2 {
public static void main(String[] args) {
// Scanner sc= new Scanner(System.in);
// String s = sc.nextLine();
// String[] s1 = s.split(" ");
// int N = Integer.parseInt(s1[0]);
// int M = Integer.parseInt(s1[1]);
// int k = Integer.parseInt(s1[2]);
// int[][] nums = new int[N][M];
// for(int i=0;i<N;i++){
// String s2 = sc.nextLine();
// String[] s3 = s2.split(" ");
// for(int j=0;j<M;j++){
// nums[i][j] = Integer.parseInt(s3[j]);
// }
// }
int[][] nums = new int[][]{{1,3,3},{2,4,9},{8,9,2}};
Partion2 partion2 = new Partion2();
System.out.println(partion2.pathLen1(nums,1));
}
public int pathLen(int[][] nums,int k){
if(nums==null || nums.length==0 ) return 0;
if(k<0) k = 0;
rows = nums.length;
cols = nums[0].length;
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){
dfs(i,j,k,0,nums);
}
}
return maxLen;
}
private int maxLen = 0;
private int[][] dir = {{-1,0},{1,0},{0,1},{0,-1}};
public void dfs(int r,int c,int k,int path,int[][] nums){
if(k<0 || path==rows*cols){
return;
}
path++;
maxLen = Math.max(path,maxLen);
for(int[] d:dir){
int rNext = r+d[0];
int cNext = c+d[1];
if(rNext<0 ||rNext>=nums.length || cNext<0 || cNext>=nums[0].length ){
continue;
}
if(nums[rNext][cNext] <=nums[r][c]){
dfs(rNext,cNext,k-1,path,nums);
}else {
dfs(rNext,cNext,k,path,nums);
}
}
}
//带记忆的dfs
private int rows=0;
private int cols = 0;
public int pathLen1(int[][] nums,int k){
if(nums==null || nums.length==0 ) return 0;
if(k<0) k = 0;
rows = nums.length;
cols = nums[0].length;
boolean[][] used = new boolean[rows][cols];
int[][][] dp = new int[rows][cols][k+1];
int res = 0;
for(int i=0;i<nums.length;i++){
for(int j=0;j<nums[0].length;j++){
dp[i][j][k] = dfs1(i,j,k,nums,dp);
res = Math.max(res,dp[i][j][k]);
}
}
return res;
}
public int dfs1(int r,int c,int k,int[][] nums,int[][][] dp){
if(dp[r][c][k]!=0) return dp[r][c][k];
dp[r][c][k] = 1;
for(int[] d:dir){
int rNext = r+d[0];
int cNext = c+d[1];
if(rNext<0 ||rNext>=rows || cNext<0 || cNext>=cols ){
continue;
}
if(nums[rNext][cNext] <=nums[r][c] && k>0){
dp[r][c][k] = Math.max(dp[r][c][k],dfs1(rNext,cNext,k-1,nums,dp)+1);
}else if(nums[rNext][cNext] > nums[r][c]){
dp[r][c][k] = Math.max(dp[r][c][k],dfs1(rNext,cNext,k,nums,dp)+1);
}
}
return dp[r][c][k];
}
}
#猿辅导##笔试题目#
