【算法】删除源文件中的注释(字节跳动面试题)

要求删除源文件中的注释,包括单行注释“//”以及多行注释“/* */”。本题是字节跳动三面面试题。
本题解法是有限状态机。注意如果采用匹配算法,如正则会有bug,比如测试用例:

/* //aaa */ bbb
// ccc

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

Java代码实现


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));
    }
}

你可能感兴趣的:(算法题,java,字节跳动,有限状态机)