【LintCode】Expression Expand 非递归stack完成DFS(String)

news/2024/7/8 4:54:45

这道题真是超级棒的stack DFS样板题啊,在这里给自己写个小小的总结

思路:
想到stack并不难,这种嵌套式一般是DFS的思想,先走到最里面最小的那个括号,然后逐渐回到上一层→上一层。又∵非递归,“BFS queue, DFS stack”。想到用stack并不难
Stack non-recursion DFS template
要点是,处理完之后重新返回stack,才能够回到上一层操作

这个题具体操作起来真是很多可圈可点的地方,主要是在于String的处理上

  1. reverse
    因为stack的顺序,在这个题中需要每次将每层里的内容reverse。直接StringBuilder的reverse方法不可取:因为是reverse每一层。e.g. 3[ab]2[c]层直接从stack取出实际上是cc, ababab将这个reverse后应该得到abababcc。这个时候考虑逆向stack,建立一个stack buffer,将stack pop出来的东西再reverse一个顺序,逆逆得顺

  2. instanceof
    nstanceof是一个很好用的操作符,a instanceof A,判断“一个对象是否是一个类的实例”。作为操作符instanceof不可以直接在最前面!取非(比如>=这种也是),而是用 a instanceof A == false之类的判断

  3. 复制StringBuilder
    add到底append几次,怎么append:直接append add 是不可以的,因为add是在变的,必须要先将第一个add保存起来,类似于dummy node,预先保存queue size这种“锚定”。


  4. 小心一点0[peer], -3[aaa]这种情况啊!

代码
public class Solution {

public String expressionExpand(String s) {
    Stack<Object> stack = new Stack<>();
    char[] arr = s.toCharArray();
    
    int num = 0;
    for(char c : arr){
       if(Character.isDigit(c)){
           num = num * 10 + c - '0';
       }
       else if(c == '['){
           stack.push(Integer.valueOf(num));
           num = 0;
       }
       else if(c == ']'){
           popStack(stack);
       }
       else{
           stack.push(c);
       }
    }
    popStack(stack);
    return stack.pop().toString();
}
private void popStack(Stack<Object> stack){
    StringBuilder add = new StringBuilder();
    int count;
    Stack<Object> buffer = new Stack<Object>();
    while(!stack.isEmpty() && stack.peek() instanceof Integer == false){
        buffer.push(stack.pop());
    }
    while(!buffer.isEmpty()){
        add.append(buffer.pop());
    }
    
    count = stack.isEmpty()? 1 : (Integer) stack.pop();
    StringBuilder part = new StringBuilder(add);
    if(count > 0){
        for(int i = 0; i < count - 1; i++)
            add.append(part);
        stack.push(add);// reput
    }
}

}


http://www.niftyadmin.cn/n/2751568.html

相关文章

ubuntu 输入密码后黑屏并且又回到输入密码的地方

好好想想你昨天的所作所为 基本是因为你昨天把哪个文件的权限给了错的人 解决方案 进入文字界面 输入 chown -R username 文件地址 之后恢复正常

VirtualBox与主机共享

2019独角兽企业重金招聘Python工程师标准>>> 主机上创建共享文件夹share&#xff0c;然后右键属性就是这个界面 点击共享到添加这个everyone&#xff0c;点击右下角的“共享”按钮&#xff0c;在弹出的页面上选否。 首先强调我的Virtual Box安装的时centos 执行sudo…

动态路由传参和params传参

动态路由传参和params一起传参的时候&#xff0c; this.$router.push({ path: ‘/home/:id’, params: { type: ‘11’ } }) 在需要参数的页面打印结果&#xff0c;不会出现内容params的内容 所以我猜想&#xff0c;params和path不应该一起使用&#xff0c;应该用params加name…

超频电脑黑屏(超频失败怎么办)

今天我遇到这么个问题 一早开机内存点亮 键盘不亮 鼠标 显示器不亮&#xff08;这三个有一个不亮 解决思路都一样&#xff09; 现在的电脑都有智能开机检测 启动失败 会直接进入恢复界面 之后进了bios 把内存频率改回去&#xff08;我默认2666 一直超在3433稳定运行&#…

修改element-ui的input框踩坑记录

修改input的样式大小时候&#xff0c;给最外层一个div&#xff0c;这个时候给div设置margin-right会出现两个距离。 这个距离的出现是因为el-input内部有个div也具有了margin-right的属性&#xff0c;使得两个距离产生。此刻我们只需要设置一下内部的div的右边界。 .wrap_div{…

Data Pump expdp/impdp数据泵版本兼容性

可以通过expdp/impdp指定versions参数(要导出的对象版本。有效的关键字值为: [COMPATIBLE], LATEST 或任何有效的数据库版本。)来保证版本兼容性&#xff0c;对于不兼容的对象会出现ORA-39139错误。 C:\Users\xiangbli>expdp dumpfileDATA_PUMP_DIR:a1.dmp fully version…

常用正则表达式

一、校验数字的表达式 数字&#xff1a;^[0-9]*$n位的数字&#xff1a;^d{n}$至少n位的数字&#xff1a;^d{n,}$m-n位的数字&#xff1a;^d{m,n}$零和非零开头的数字&#xff1a;^(0|1-9*)$非零开头的最多带两位小数的数字&#xff1a;^(1-9*)(.[0-9]{1,2})?$带1-2位小数的正数…

趣谈网络原理 ICMP(自我提升第二十天)

菜鸟准备专精一门&#xff0c;所以c语言、java的链表代码就不写了&#xff0c;但是js的一定会写&#xff0c;菜鸟现在手受伤了&#xff0c;能写博客就不简单&#xff0c;如果又敲代码又写博客&#xff0c;一来手恢复会变慢&#xff0c;二来我得打针也没那么多时间&#xff0c;望…