猿辅导前两题

第一题:

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];
    }


}
#猿辅导##笔试题目#
全部评论

相关推荐

明天不下雨了:我靠2022了都去字节了还什么读研我教你****:你好,本人985电子科大在读研一,本科西南大学(211)我在字节跳动实习过。对您的岗位很感兴趣,希望获得一次投递机会。
点赞 评论 收藏
分享
黑皮白袜臭脚体育生:春节刚过就开卷吗?哈基馆,你这家伙......
点赞 评论 收藏
分享
评论
点赞
12
分享

创作者周榜

更多
牛客网
牛客企业服务