• leetcode722


    Given a C++ program, remove comments from it. The program source is an array where source[i] is the i-th line of the source code. This represents the result of splitting the original source code string by the newline character .
    In C++, there are two types of comments, line comments, and block comments.
    The string // denotes a line comment, which represents that it and rest of the characters to the right of it in the same line should be ignored.
    The string /* denotes a block comment, which represents that all characters until the next (non-overlapping) occurrence of */should be ignored. (Here, occurrences happen in reading order: line by line from left to right.) To be clear, the string /*/ does not yet end the block comment, as the ending would be overlapping the beginning.
    The first effective comment takes precedence over others: if the string // occurs in a block comment, it is ignored. Similarly, if the string /* occurs in a line or block comment, it is also ignored.
    If a certain line of code is empty after removing comments, you must not output that line: each string in the answer list will be non-empty.
    There will be no control characters, single quote, or double quote characters. For example, source = "string s = "/* Not a comment. */";" will not be a test case. (Also, nothing else such as defines or macros will interfere with the comments.)
    It is guaranteed that every open block comment will eventually be closed, so /* outside of a line or block comment always starts a new comment.
    Finally, implicit newline characters can be deleted by block comments. Please see the examples below for details.
    After removing the comments from the source code, return the source code in the same format.
    Example 1:
    Input:
    source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]
    The line by line code is visualized as below:
    /*Test program */
    int main()
    {
    // variable declaration
    int a, b, c;
    /* This is a test
    multiline
    comment for
    testing */
    a = b + c;
    }
    Output: ["int main()","{ "," ","int a, b, c;","a = b + c;","}"]
    The line by line code is visualized as below:
    int main()
    {
    int a, b, c;
    a = b + c;
    }
    Explanation:
    The string /* denotes a block comment, including line 1 and lines 6-9. The string // denotes line 4 as comments.
    Example 2:
    Input:
    source = ["a/*comment", "line", "more_comment*/b"]
    Output: ["ab"]
    Explanation: The original source string is "a/*comment line more_comment*/b", where we have bolded the newline characters. After deletion, the implicit newline characters are deleted, leaving the string "ab", which when delimited by newline characters becomes ["ab"].
    Note:
    * The length of source is in the range [1, 100].
    * The length of source[i] is in the range [0, 80].
    * Every open block comment is eventually closed.
    * There are no single-quote, double-quote, or control characters in the source code.

    实现题。
    每一行的内容都有剩出一部分有意义code,作为newLine加入到结果的潜力。扫描每行,分别检索comment标志符”/*”, “*/“, “//“来进行相关逻辑处理。同时用一个全局变量isInBlock记忆当前的状态,是否在/**/里,来帮助逻辑的处理。
    1.如果现在isInBlock,那就只想着找到”*/“。
    2.如果现在!isInBlock,如果找到”/*”,即反转block状态了;如果找到”//“,那这行剩下都没用了;如果不是特殊标志符,那把这个有意义的char for code加到当前行的结果上。
    一行扫完后,如果发现这行有加有意义内容,就加入最终结果里。

    细节:
    1.为了题目要求的a/*xxx, xxx, xxx*/c最后要拿到ac而不是a,c这种要求,要把newLine拿出去做全局变量,使得不同行可以放到结果的一行里。创造新行和添加结果的时候都加点小花边。
    2.判断两个字符的时候注意一下边界检查。

    实现:

    class Solution {
        public List<String> removeComments(String[] source) {
            List<String> ans = new ArrayList<>();
            boolean isInBlock = false;
            String newLine = "";
            for (String line : source) {
                if (!isInBlock) newLine = "";
                for (int i = 0; i < line.length(); i++) {
                    if (!isInBlock && i + 1 < line.length() && line.substring(i, i + 2).equals("/*")) {
                        isInBlock = true;
                        i++;
                    } else if (isInBlock && i + 1 < line.length() && line.substring(i, i + 2).equals("*/")) {
                        isInBlock = false;
                        i++;
                    } else if (!isInBlock && i + 1 < line.length() && line.substring(i, i + 2).equals("//")) {
                        break;
                    } else if (!isInBlock){
                        newLine += line.charAt(i);
                    }
                }
                if (!isInBlock && newLine.length() > 0) {
                    ans.add(newLine);
                }
            }
            return ans;
        }
    }
  • 相关阅读:
    【转载】实用VC++6.0插件
    关于无标题栏窗口拖动的问题
    VC6配置CXimage库
    扎实基础深入篇(七):函数和类没那么复杂
    扎实基础深入篇(六):while循环带动生产力
    扎实基础深入篇(五):字典也就是个弟弟
    扎实基础深入篇(四):听说if语句很叼?
    lxml类库的xpath的使用
    json与re的再次复习
    python基础汇总(四)
  • 原文地址:https://www.cnblogs.com/jasminemzy/p/9739410.html
Copyright © 2020-2023  润新知