《LeetCode之每日一题》:127.删除注释

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:127.删除注释相关的知识,希望对你有一定的参考价值。

删除注释


题目链接: 删除注释

有关题目

示例 1:

输入: 
source = ["/*Test program */", "int main()", 
"{ ", "  // variable declaration ", 
"int a, b, c;", "/* This is a test", 
"   multiline  ", "   comment for ",
 "   testing */", "a = b + c;", "}"]

示例代码可以编排成这样:
/*Test program */
int main()
{ 
  // variable declaration 
int a, b, c;
/* This is a test
   multiline  
   comment for 
   testing */
a = b + c;
}

输出: ["int main()","{ ","  ",
"int a, b, c;","a = b + c;","}"]

编排后:
int main()
{ 
  
int a, b, c;
a = b + c;
}

解释:1 行和第 6-9 行的字符串 /* 表示块注释。第 4 行的字符串 // 表示行注释。
示例 2:

输入: 
source = ["a/*comment", "line", 
"more_comment*/b"]
输出: ["ab"]
解释: 原始的 source 字符串是 "a/*comment\\nline\\nmore_comment*/b", 
我们显示了换行符。删除注释后,隐含的换行符被删除,留下字符串 "ab" 用换行符分隔成数组时就是 ["ab"].

题解

法一:转换

先 把所有字符串组合成一个完整的字符串,之间用\\n隔开,
然后遍历字符串,遇到//时,删除到\\n, 遇到/*,删除到*/,
最后的字符串再用\\n分割开。就是结果。

Java中String.join()用法
Java中indexof用法
参考题目评论下繁华题解的verygoodlee

class Solution {
    public List<String> removeComments(String[] source) {
        String src = String.join("\\n", source) + '\\n';
        for (int i = 0; i < src.length() - 1; ) {
            int j = src.indexOf('/', i);
            if (j == -1) break;
            char ch = src.charAt(j + 1);
            if (ch == '*') {
                // 删除/*....*/ ,全删
                src = src.substring(0, j) + src.substring(src.indexOf("*/", j + 2) + 2);
                i = j;
            } else if (ch == '/') {
                // 删除//....\\n ,换行符\\n保留
                src = src.substring(0, j) + src.substring(src.indexOf('\\n', j + 2));
                i = j + 1;
            } else {
                i = j + 2;
            }
        }
        List<String> target = new ArrayList<>(Arrays.asList(src.split("\\n")));
        //将数组以'\\n'为分隔符转化成List集合
        target.removeIf(String::isEmpty);
        return target;
    }
}


法二:模拟

class Solution {
public:
    vector<string> removeComments(vector<string>& source) {
        bool inBlock = false;
        string newLine;
        vector<string> ans;
        for (auto& s : source){
            int i = 0;
            if (!inBlock) newLine.clear();//不在注释块内,上一行字符串内容清空,长度变为0
            while(i < s.length()){
                if (!inBlock && i + 1 < s.length() && s[i] == '/' && s[i + 1] == '*'){
                    inBlock = true;
                    ++i;
                }
                else if (inBlock && i+1 < s.length() && s[i] == '*' && s[i+1] == '/'){
                    inBlock = false;
                    ++i;
                }
                else if (!inBlock && i+1 < s.length() && s[i] == '/' && s[i+1] == '/'){
                    break;
                }
                else if (!inBlock){
                    newLine.push_back(s[i]);   
                }
                ++i;
            }

            //将不再注释内的内容添加到答案数组中
            if (!inBlock && newLine.size() > 0){
                ans.push_back(newLine);
            }
        }
        return ans;
    }
};

以上是关于《LeetCode之每日一题》:127.删除注释的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:159.两个字符串的删除操作

《LeetCode之每日一题》:133.删除链表中的节点

《LeetCode之每日一题》:98.删除排序链表中的重复元素

《LeetCode之每日一题》:288.删除排序链表中的重复元素

《LeetCode之每日一题》:288.删除排序链表中的重复元素

《LeetCode之每日一题》:149.通过删除字母匹配到字典里最长单词