华为笔试第二题:字符串的展开题目,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

相关推荐

双飞二本嵌入式求拷打我是在&nbsp;BOSS&nbsp;上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1.&nbsp;嵌入式开发能力:&nbsp;&nbsp;&nbsp;熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。&nbsp;&nbsp;熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。&nbsp;&nbsp;熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2.&nbsp;硬件设计能力:&nbsp;&nbsp;&nbsp;具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。&nbsp;&nbsp;&nbsp;熟悉硬件原理图分析,能够快速理解并调试硬件电路。3.&nbsp;机器人开发与竞赛经验:&nbsp;&nbsp;&nbsp;在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。&nbsp;&nbsp;&nbsp;熟悉Linux环境,对ROS和ROS&nbsp;2有一定了解,能够进行机器人系统的开发与调试。4.&nbsp;编程能力:&nbsp;&nbsp;&nbsp;熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。&nbsp;&nbsp;&nbsp;具备良好的代码规范和文档编写能力。5.&nbsp;团队协作与领导能力:&nbsp;&nbsp;&nbsp;在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。&nbsp;&nbsp;&nbsp;在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
评论
点赞
47
分享

创作者周榜

更多
牛客网
牛客企业服务