《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之每日一题》:98.删除排序链表中的重复元素
《LeetCode之每日一题》:288.删除排序链表中的重复元素