华为笔试第二题:字符串的展开题目,java

题目描述

给定一个字符串,字符串包含数字、大小写字母以及括号(包括大括号,中括号,小括号),括号可以嵌套,即括号里面可以出现数字和括号。

按照如下规则对字符串进行展开,不需要考虑括号不成对的问题,不考虑数字后面没有括号的情况,即 2a2(b)不考虑。

  • 数字表示括号里的字符串重复的次数,展开后的字符串不包含括号
  • 将字符串进行逆序展开
输入abc2{de3[fg]}

输出gfgfgfedgfgfgfedcba

解法

利用栈进行计算,每次判断此时是否是右括号,如果是的话,拿到对应的左括号之前的所有字符,在拿到对应左括号的数字,对字符进行重复以后,全部入栈。

如果不是右括号,那么直接入栈。

import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        int len = line.length();
        LinkedList<String> stack1 = new LinkedList<>();

        //输入abc2{de3[fg]}
        //输出gfgfgfedgfgfgfedcba
        for (int i = 0; i < len; i++) {
            String temp = line.charAt(i) + "";
            if (")]}".contains(temp)) {

                //得到上一个(括号之前的字母
                StringBuilder dup = new StringBuilder();
                while (!"({[".contains(stack1.getFirst())) {
                    dup.insert(0,stack1.removeFirst());
                }
                stack1.removeFirst();

                //注意此时的坑,因为数字可能是多位数,因此需要得到所有的数字
                StringBuilder numStr = new StringBuilder();
                while (!stack1.isEmpty() && stack1.getFirst().matches("[0-9]")) {
                    numStr.insert(0, stack1.removeFirst());
                }
                int num = Integer.parseInt(numStr.toString());

                //按照(前的数字进行重复,并且再次压入栈
                StringBuilder str = new StringBuilder();
                while (num > 0) {
                    str.append(dup);
                    --num;
                }
                for (int k = 0; k < str.length(); k++) {
                    stack1.addFirst(str.charAt(k) + "");
                }
            } else {
                stack1.addFirst(temp);
            }
        }
        StringBuilder result = new StringBuilder();
        while (!stack1.isEmpty()) {
            result.append(stack1.removeFirst());
        }
        System.out.println(result.toString());
    }
}
#华为##笔试题目##笔经#
全部评论
import java.util.Scanner; public class Main2{     public static void main(String[] args) {         // TODO Auto-generated method stub         Scanner scanner=new Scanner(System.in);         String input=scanner.nextLine();         String output=getStr(input);         for(int i=output.length()-1;i>=0;i--)         {             System.out.print(output.charAt(i));         }                   }     public static String getStr(String temp)     {         StringBuilder stringBuilder=new StringBuilder();         int end=0;         for(int i=0;i<temp.length();)         {             if(temp.charAt(i)>='0'&&temp.charAt(i)<='9')             {                 if(temp.charAt(i+1)=='{')                 {                     end=temp.lastIndexOf("}");                 }                 else if(temp.charAt(i+1)=='[')                 {                     end=temp.lastIndexOf("]");                 }                 else if(temp.charAt(i+1)=='(')                 {                     end=temp.lastIndexOf(")");                 }                 for(int j=0;j<temp.charAt(i)-'0';j++)                 {                     stringBuilder.append(getStr(temp.substring(i+2,end)));                 }                 i=end+1;             }             else             {                 stringBuilder.append(temp.charAt(i));                 i++;             }             }         return stringBuilder.toString();     } } 递归实现~
点赞 回复 分享
发布于 2019-04-11 10:13
正解~我也这么做的~
点赞 回复 分享
发布于 2019-04-11 00:53
我是用递归函数做的
点赞 回复 分享
发布于 2019-04-11 09:59
我就是用栈写的,没能写出来 觉得 一个栈不够。大佬 你的代码里面分明用的是linklist 他不是双向链表结构吗??
点赞 回复 分享
发布于 2019-04-11 10:26
sr=input()x=0def sc():    global x    k=""    while x<len(sr):        if not(sr[x].isalnum()):            return k        if sr[x].isdigit():            t=int(sr[x])            x =2            k =sc()*t        else:            k =sr[x]            x =1    return kk=""while x<len(sr):    k =sc()    x =1print(k[::-1])
点赞 回复 分享
发布于 2019-04-11 23:41
import java.util.Scanner; import java.util.Stack; public class Main {     public static void main(String[] args )     {         Scanner sr =new Scanner(System.in);         String str=sr.next();         sr.close();         StringBuffer sb=new StringBuffer(openString(str));         System.out.println(sb.reverse());            }     public static String openString(String str) {          if(!str.matches(".*\\d+.*")) {              return str;          }         Stack stack=new Stack();         int left=0;         int right=0;                    //左右指针分别指向每次处理最里面一层的字符串         for(int i=0;i<str.length();i++)         {             char c=str.charAt(i);             if(!(c==')'||c==']'||c=='}'))              {                 stack.push(c);             }             else {                 right=i;                 break;             } }                                        //遍历先找到最前面的")"、"]"、"}" ,在此之前全部存栈         left=right;         char sc=(char) stack.pop();              left--;         String s="";         while(!(sc=='('||sc=='['||sc=='{'))  //弹栈找到最近的"("、"["、"{",在找到之前都是叠加的,全部存储         {             s=sc+s;             sc=(char)stack.pop();             left--;         }         sc=(char) stack.pop();         int count=(int)sc-(int)'0';          //取出数字,叠加展开         left--;         String ss="";         while(count>0) {             ss+=s;             count--;         }         str=str.substring(0,left)+ss+str.substring(right+1,str.length());  //替换原数组中的处理部分,递归。         return openString(str);     } }
点赞 回复 分享
发布于 2019-09-11 16:18

相关推荐

躺尸修仙中:因为很多92的也去卷中小厂,反正投递简历不要钱,面试不要钱,时间冲突就推,不冲突就面试积累经验
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
点赞 47 评论
分享
牛客网
牛客企业服务