猿辅导后台开发笔试第一题java版本(50行)

对于给定的压缩字符串进行解压


 // 本题为考试单行多行输入输出规范示例,无需提交,不计分。
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        for (int i=0;i<=n;i++) {// 注意,如果输入是多个测试用例,请通过while循环处理多个测试用例
            String line = in.nextLine();
            System.out.println(parse(line));
        }
    }
    private static String parse(String str) {
        StringBuilder sb  = new StringBuilder();
        LinkedList<Integer> len = new LinkedList();
        String temp="";
        for(int i=0;i<str.length();i++){
            if(str.charAt(i) ==   '('){
                len.add(sb.length());
                continue;
            }

            if (str.charAt(i) ==   ')') {
                int leftIndexNew = len.remove(len.size()-1);

                temp = sb.substring(leftIndexNew);
                i++;
            }

            int start = i;
            while(i<str.length() && str.charAt(i)<='9' && str.charAt(i)>='0'){
                i++;
            }
            if( i-start >= 1){
                int count = Integer.valueOf(str.substring(start,i));
                for(int j=0;j<count-1;j++){
                    if(temp == "")
                        sb.append(str.charAt(start-1));
                    else 
                        sb.append(temp);
                }
                temp = "";
                i--;
            }
            else {
                sb.append(str.charAt(i));
            }
        }
        return sb.toString();
    }

} 


#猿辅导##笔试题目#
全部评论
棒!添加注解版!    public static String parse(String str){         StringBuilder sb = new StringBuilder();         LinkedList<Integer> len = new LinkedList<>();         String temp = ""; // 记录括号内的字符串         // 针对字符串,处理顺序依次为:去括号,统计出现次数,拼接结果         for(int i=0;i<str.length();i++){             char c = str.charAt(i);             if(c == '('){                 len.add(sb.length());                 continue;             }             if(c == ')'){                 // 移除上一个括号开始时的下标                 int newLeftIndex = len.remove(len.size()-1);                 temp = sb.substring(newLeftIndex);                 i++;             }             // 处理数字             int start = i;             while (i<str.length() && str.charAt(i)>='0' && str.charAt(i)<='9'){                 i++;             }             // 获取字符后面的数字             if(i-start>=1){                 int count = Integer.valueOf(str.substring(start,i));                 for(int k=0;k<count-1;k++){                     if (temp==""){                         sb.append(str.charAt(start-1));                     }else {                         sb.append(temp);                     }                 }                 temp = "";                 i--;//若存在数字,此时i指向的字符并没有经过上述判断,所以需要减去1.             }else {                 sb.append(str.charAt(i));             }         }         return sb.toString();     }
点赞 回复 分享
发布于 2019-08-08 16:11

相关推荐

11-08 17:36
诺瓦科技_HR
点赞 评论 收藏
分享
去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
3 23 评论
分享
牛客网
牛客企业服务