华为笔试第二题:字符串的展开题目,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
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
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
我就是用栈写的,没能写出来 觉得 一个栈不够。大佬 你的代码里面分明用的是linklist 他不是双向链表结构吗??
点赞 回复 分享
发布于 2019-04-11 10:26
我是用递归函数做的
点赞 回复 分享
发布于 2019-04-11 09:59
正解~我也这么做的~
点赞 回复 分享
发布于 2019-04-11 00:53

相关推荐

自从我室友在计算机导论课上听说了“刷&nbsp;LeetCode&nbsp;是进入大厂的敲门砖”,整个人就跟走火入魔了一样。他在宿舍门口贴了一张A4纸,上面写着:“正在&nbsp;DP,请勿打扰,否则&nbsp;Time&nbsp;Limit&nbsp;Exceeded。”日记本的扉页被他用黑色水笔加粗描了三遍:“Talk&nbsp;is&nbsp;cheap.&nbsp;Show&nbsp;me&nbsp;the&nbsp;code。”连宿舍聚餐,他都要给我们讲解:“今天的座位安排可以用回溯算法解决,但为了避免栈溢出,我建议用动态规划。来,这是状态转移方程:dp[i][j]&nbsp;代表第&nbsp;i&nbsp;个人坐在第&nbsp;j&nbsp;个位置的最优解。”我让他去楼下取个快递,他不直接去,非要在门口踱步,嘴里念念有词:“这是一个图的遍历问题。从宿舍楼(root)到驿站(target&nbsp;node),我应该用&nbsp;BFS&nbsp;还是&nbsp;DFS?嗯,求最短路径,还是广度优先好。”和同学约好出去开黑,他会提前发消息:“集合点&nbsp;(x,&nbsp;y),我们俩的路径有&nbsp;k&nbsp;个交点,为了最小化时间复杂度,应该在&nbsp;(x/2,&nbsp;y/2)&nbsp;处汇合。”有一次另一个室友低血糖犯了,让他帮忙找颗糖,他居然冷静地分析道:“别急,这是一个查找问题。零食箱是无序数组,暴力查找是&nbsp;O(n)。如果按甜度排序,我就可以用二分查找,时间复杂度降到&nbsp;O(log&nbsp;n)。”他做卫生也要讲究算法效率:“拖地是典型的岛屿问题,要先把连通的污渍区块都清理掉。倒垃圾可以用双指针法,一个指针从左往右,一个从右往左,能最快匹配垃圾分类。”现在我们宿舍的画风已经完全变了,大家不聊游戏和妹子,对话都是这样的:“你&nbsp;Two&nbsp;Sum&nbsp;刷了几遍了?”“别提了,昨天遇到一道&nbsp;Hard&nbsp;题,我连暴力解都想不出来,最后只能看题解。你呢?”“我动态规划还不行,总是找不到最优子结构。今天那道接雨水给我整麻了。”……LeetCode&nbsp;真的害了我室友!!!
老六f:编程嘉豪来了
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
47
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务