2013亚马逊校招机试题A

题目没复制下来,凭印象写的。

删除代码中的的注释。注释分两种,//和/**/。字符串中出现的注释符号不能被当作注释。

解题思路:

以前编译原理课做过类似的程序,分出几个状态,并做状态转移判断即可。

StringBuilder中存放返回的字符串。动作a表示添加当前字符到StringBuilder,b表示删除StringBuilder中最后一个字符。-表示其他字符或者无动作或者状态不转变

状态 字符 转变状态 动作
0 1 a
0 / 2 a
0 - - a
1 0 a
1 - - a
2 * 3 b
2 / 4 b
2 - 0 a
3 * 5 -
3 - - -
4 \n 0 a
4 - - -
5 / 0 -
5 * - -
5 - 3 -
static void backOne(StringBuilder sb) {  
    sb.delete(sb.length() - 1, sb.length());  
}  
  
static String removeComment(String s) {  
    StringBuilder sb = new StringBuilder();  
    int state = 0;  
    for (int i = 0; i < s.length(); i++) {  
        char c = s.charAt(i);  
        switch (state) {  
        case 0:  
            switch (c) {  
            case '"':  
                sb.append(c);  
                state = 1;  
                break;  
            case '/':  
                sb.append(c);  
                state = 2;  
                break;  
            default:  
                sb.append(c);  
            }  
            break;  
        case 1:  
            switch (c) {  
            case '"':  
                sb.append(c);  
                state = 0;  
                break;  
            default:  
                sb.append(c);  
            }  
            break;  
        case 2:  
            switch (c) {  
            case '*':  
                backOne(sb);  
                state = 3;  
                break;  
            case '/':  
                backOne(sb);  
                state = 4;  
                break;  
            default:  
                sb.append(c);  
                state = 0;  
            }  
            break;  
        case 3:  
            switch (c) {  
            case '*':  
                state = 5;  
                break;  
            }  
            break;  
        case 4:  
            switch (c) {  
            case '\n':  
                sb.append(c);  
                state = 0;  
                break;  
            }  
            break;  
        case 5:  
            switch (c) {  
            case '/':  
                state = 0;  
                break;  
            case '*':  
                break;  
            default:  
                state = 3;  
            }  
        }  
    }  
    return sb.toString();  
} 

Comments

comments powered by Disqus