前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >删除源文件中的注释

删除源文件中的注释

作者头像
崔笑颜
发布2020-07-16 15:30:46
1.9K0
发布2020-07-16 15:30:46
举报

我们定义三个状态:普通NORMAL、单行注释SINGLE以及多行注释MULTI;并定义行为:单行注释开始标志SINGLE_START、多行注释开始标志MULTI_START、单行注释结束标志SINGLE_END、多行注释结束标志MULTI_END、无行为NONE。 每次根据字符串信息,判断当前位置的行为,并根据当前状态进行转移。如果是正常状态则取值,否则丢弃。

注意由于注释占两个字符,需要进行两个字符的判断并根据之前状态和现在状态决定是否保留前一个字符。

Java代码实现

代码语言:javascript
复制
class Solution {

    public enum State{
        NORMAL, MULTI, SINGLE;
    }

    public enum Action{
        MULTI_START, MULTI_END, SINGLE_START, SINGLE_END, NONE;
    }

    public State getNextState(State state, char pre, char cur){
        // 判断动作
        Action action;
        if(pre == '/' && cur == '*') action = Action.MULTI_START;
        else if(pre == '/' && cur == '/') action = Action.SINGLE_START;
        else if(pre == '*' && cur == '/') action = Action.MULTI_END;
        else if(cur == '\n') action = Action.SINGLE_END;
        else action = Action.NONE;

        // 进行状态转移
        switch (state){
            case NORMAL:
                switch (action){
                    case SINGLE_START:
                        return State.SINGLE;
                    case MULTI_START:
                        return State.MULTI;
                    default:
                        return State.NORMAL;
                }
            case SINGLE:
                switch (action){
                    case SINGLE_END:
                        return State.NORMAL;
                    default:
                        return State.SINGLE;
                }
            case MULTI:
                switch (action){
                    case MULTI_END:
                        return State.NORMAL;
                    default:
                        return State.MULTI;
                }
        }
        return State.NORMAL;
    }

    public String solve(String source){
        char[] chars = source.toCharArray();
        StringBuilder sb = new StringBuilder();
        State pre = State.NORMAL;
        State state = State.NORMAL;
        sb.append(chars[0]);
        for(int i=1;i<chars.length;i++){
            pre = state;
            state = getNextState(state, chars[i-1], chars[i]);
            if(pre == State.NORMAL && state != State.NORMAL)
                sb.deleteCharAt(sb.length()-1);
            if(pre == State.NORMAL && state == State.NORMAL) sb.append(chars[i]);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        String source="/* //aaa  */   bbb  \n // ccc \n";
        System.out.println(new Solution().solve(source));
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档