4.10华为第2题解答


题目没有说清楚是否是递归展开的部分是否需要翻转.事实证明题目的意思是整体展开后才反序
重点在于如何展开,想法是递归.如果没有找到数字那么直接输出原字符串,如果找到数字n,说明数字后面
有一对括号.
原来的字符串拆为4部分,第1部分是数字n之前,第2部分是数字n,第3部分是n后面的括号中内容,第4部分是括号后面部分
s=part1+part2+(part3)+part4
递归展开part3,重复n次后挂到part1后面.再挂上part4递归展开的结果得到整个展开式
下面的代码保留了一些调试信息.如果要通过测试,需要将类名改为Main并且将main函数中的
new HuaWeiQ5()...改为new Main()...
import java.util.*;
public class HuaWeiQ5 {
public String expandString(String s) {
    boolean findNumber=false;
    for(int i=0;i<s.length();i++)
        if(Character.isDigit(s.charAt(i))) {
            findNumber=true;
            break;
        }
    if(!findNumber) {
        StringBuilder sb=new StringBuilder(s);
        sb.reverse();
        //return sb.toString();
        return s;
    }
    Stack<Character>stack=new Stack<Character>();
    int firstDigitPos=-1,lastDigitPos=-1;
        int i=0;
        while(!Character.isDigit(s.charAt(i)))i++;
        firstDigitPos=i;
        while(Character.isDigit(s.charAt(i)))i++;
        lastDigitPos=i-1;
        String part1=s.substring(0,firstDigitPos);
        String part2=s.substring(firstDigitPos,lastDigitPos+1);
        int leftParentesePos=lastDigitPos+1;
        int rightParentesePos=-1;
        //s[leftParentesePos]应该是一个括号,我们需要找到与它匹配的括号
        stack.push(s.charAt(leftParentesePos));
        for(i=leftParentesePos+1;i<s.length();i++) {
            if(isLeftParenthese(s.charAt(i)))
                    stack.push(s.charAt(i));
            else if(isRightParenthese(s.charAt(i)))
                stack.pop();
            if(stack.isEmpty()) {
                rightParentesePos=i;
                break;}
        }
        String part3=s.substring(leftParentesePos+1,rightParentesePos);
        String part4=s.substring(rightParentesePos+1);
        //System.out.println(part1);
        //System.out.println(part2);
        //System.out.println(part3);
        String later=expandString(part4);
                int repeatTimes=Integer.parseInt(part2);
        StringBuilder sb=new StringBuilder(part1);
        part3=expandString(part3);
        for(int j=0;j<repeatTimes;j++)
            sb.append(part3);
        sb.append(later);
    return sb.toString();
}
public boolean isLeftParenthese(char ch) {
    
    return ch=='('||ch=='['||ch=='{';
}
public boolean isRightParenthese(char ch) {
    
    return ch==')'||ch==']'||ch=='}';
}
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //String s="abc3(A)";
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        String ans=new HuaWeiQ5().expandString(s);
        System.out.println(ans);
    }
}



#华为##笔试题目#
全部评论
一个栈就解决了
点赞 回复 分享
发布于 2019-04-10 21:18
package com.company; import java.util.Scanner; public class Main { public static String strGame(String str){ if(str==null||str.length()<=0) return str; String new_str=""; int index[]={0}; String res=getStr(str,index); for(int i=0;i<res.length();i++) new_str=res.charAt(i)+new_str; return new_str; } public static String getStr(String str,int re_index[]){ if(str==null||str.length()<=0) return str; int index=re_index[0]; String res=""; String num=""; while(index<str.length()){ if(str.charAt(index)>='0'&&str.charAt(index)<='9'){ num=num+str.charAt(index); index++; } else if(str.charAt(index)==')'||str.charAt(index)==']'||str.charAt(index)=='}') { re_index[0]=index+1; return res; } else if(str.charAt(index)=='('||str.charAt(index)=='['||str.charAt(index)=='{'){ re_index[0]=index+1; String repeat=getStr(str,re_index); index=re_index[0]; int n=Integer.valueOf(num); num=""; while(n>0){ res+=repeat; n--; } } else{ res+=str.charAt(index); index++; } } return res; } public static void main(String[] args) { // write your code here Scanner sc = new Scanner(System.in); String str = sc.nextLine(); ///abc3(A4(b)) str=strGame(str); System.out.print(str); } }
点赞 回复 分享
发布于 2019-04-10 21:27

相关推荐

群星之怒:1.照片可以换更好一点的,可以适量P图,带一些发型,遮住额头,最好穿的正式一点,可以适当P图。2.内容太少。建议添加的:求职意向(随着投递岗位动态更改);项目经历(内容太少了建议添加一些说明,技术栈:用到了什么技术,还有你是怎么实现的,比如如何确保数据传输稳定的,角色注册用到了什么技术等等。)项目经历是大头,没有实习是硬伤,如果项目经理不突出的话基本很难过简历筛。3.有些内容不必要,比如自我评价,校内实践。如果实践和工作无关千万别写,不如多丰富丰富项目。4.排版建议:建议排版是先基础信息,然后教育背景(要突出和工作相关的课程),然后专业技能(一定要简短,不要长篇大论,写你会什么,会的程度就可以),然后是项目经历(一定要详细,占整个简历一定要超过一半,甚至超过百分之70都可以)。最后如果有一部分空白的话可以填补上校内获得的专业相关的奖项,没有就写点校园经历和自我评价。5.技术一定要够硬,禁得住拷打。还有作息尽量保证正常,不要太焦虑。我24双非本科还是非科班,秋招春招各找了一段实习结果都没有转正,当时都想噶了,最后6月份在校的尾巴也找到一份工作干到现在,找工作有时很看运气的不要急着自我否定。 加油
点赞 评论 收藏
分享
评论
点赞
6
分享

创作者周榜

更多
牛客网
牛客企业服务