3.24 leetcode 字符串解码 (栈 中等)

在这里插入图片描述

  • StringBuffer向String转: String str = sb.toString();
  • StringBuffer复制后,会改变原来的值,

1.String在修改时不会改变对象自身,在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用String。

2.StringBuffer在修改时会改变对象自身
每次结果都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在字符串对象经常改变的情况下推荐使用StringBuffer。因此,用StringBuffer实现的 strCpy2比用String实现的strCpy1效率高

  • 不能将StringBuffer赋值为null,否则不能append,
  • char类型使用==,字符串类型使用equals(比较字符串是否引用同一地址,如果2个字符串是同一个对象,那可以用,如果不是同一个对象,只是比较内容是否一致,则不可以用==)
  • 将字符char转为整数
    先转为字符串
String temp = s.charAt(i) +"";
num = num*10 + Integer.parseInt(temp); 
import java.util.*;
class  ss1
{
	public static void main(String[] args) 
	{
		String s = "3[a10[bc]]";
		System.out.println(decodeString(s));
	}
	
    public static String decodeString(String s) {

    
       Deque<Integer> dstack = new LinkedList<Integer>();
        Deque<Character> sstack = new LinkedList<Character>();
        //StringBuffer fan = new StringBuffer();
        //将数字进数字栈
        int num = 0;
      
        for(int i = 0; i < s.length(); i++)
        {
           System.out.println("当前字符串:"+s.charAt(i));
		
			if(Character.isDigit(s.charAt(i)))
			{
				String temp = s.charAt(i) +"";
				num = num*10 + Integer.parseInt(temp); 
				//如果是100,需要判断后面是否为数字,如果不是,才存入
				if(!Character.isDigit(s.charAt(i + 1)))
				{
					dstack.push(num);  
					System.out.println(num);
					num = 0;
				}
				//System.out.println("sstack.peek():"+sstack.peek());
			}
			

            //如果是左括号和字符,进字符栈
            else if(!Character.isDigit(s.charAt(i)) && s.charAt(i) != ']')
            {
			
                sstack.push(s.charAt(i));
				System.out.println("sstack.peek():"+sstack.peek());

            }
            //如果是右括号,出栈
            else if(s.charAt(i) == ']')
            {
                StringBuffer fan = new StringBuffer();
				while(sstack.peek() != '[')
                {
                    
					System.out.println("sstack.peek():"+sstack.peek());
					fan.append(sstack.pop());
                }
                //System.out.println(fan);
                //将【出栈
                sstack.pop();
            
                fan = fan.reverse();
				System.out.println("fan:"+fan);

				//
                //StringBuffer fan_copy = fan;
				int len = fan.length();
				 //System.out.println("fan_copy:"+fan_copy);
				//System.out.println("fan_copy.length():"+fan_copy.length());
                //将数字栈顶出栈;
                int cishu = dstack.pop()-1;

				System.out.println("cishu:"+cishu);
                //将字符串重复
                while(cishu > 0)
                {
                    //遍历StringBuffer的字符
                    //for(String ss:fan_copy)
                    for(int k = 0; k < len; k++)
                    {
                        fan.append(fan.charAt(k));
						System.out.println("k:"+k);
						System.out.println("fan:"+fan);
						//System.out.println("fan_copy.length():"+fan_copy.length());
						//System.out.println("cishu-1:"+cishu);
                    }
                    cishu--;
                }
				System.out.println("fan_chongfu:"+fan);
                //将重复的字符串进字符栈
                //遍历StringBuffer的字符
				
                for(int j = 0; j < fan.length(); j++)
                {
                    sstack.push(fan.charAt(j));
                }
			
                

            }
           // num = 0;    
        }
        //将字符串栈中的元素保存为字符串
        StringBuffer re= new StringBuffer();
        Iterator<Character> it = sstack.iterator();
        while(it.hasNext())
        {
            Character cur = it.next();
            re.append(cur);
        }
        re.reverse();
        String str = re.toString();
        return str;

    }
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值