删除注释
难度:
标签:
题目描述
代码结果
运行时间: 29 ms, 内存: 16.0 MB
/*
* 思路:
* 使用Java Stream API来简化遍历过程,
* 同时仍然使用标志变量isBlockComment来处理块注释。
*/
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Solution {
public List<String> removeComments(String[] source) {
StringBuilder newLine = new StringBuilder();
boolean[] isBlockComment = {false}; // Using array for mutable boolean
return Arrays.stream(source)
.map(line -> {
StringBuilder currentLine = new StringBuilder();
for (int i = 0; i < line.length(); i++) {
if (isBlockComment[0]) {
if (i + 1 < line.length() && line.charAt(i) == '*' && line.charAt(i + 1) == '/') {
isBlockComment[0] = false;
i++;
}
} else {
if (i + 1 < line.length() && line.charAt(i) == '/' && line.charAt(i + 1) == '*') {
isBlockComment[0] = true;
i++;
} else if (i + 1 < line.length() && line.charAt(i) == '/' && line.charAt(i + 1) == '/') {
break;
} else {
currentLine.append(line.charAt(i));
}
}
}
if (!isBlockComment[0] && currentLine.length() > 0) {
return currentLine.toString();
} else {
return null;
}
})
.filter(line -> line != null && !line.isEmpty())
.collect(Collectors.toList());
}
}
解释
方法:
这个题解是用迭代的方式来处理每一行代码。它维护了一个布尔变量 in_block_comment 来表示当前是否处于块注释中,以及一个字符串 current_line 来存储当前正在构建的有效代码行。通过遍历每一行代码中的每个字符,根据不同的情况来判断是否需要忽略某些字符:
1. 如果当前不在块注释中,并且遇到了 /* ,则进入块注释状态;
2. 如果当前在块注释中,并且遇到了 */ ,则退出块注释状态;
3. 如果当前不在块注释中,并且遇到了 // ,则忽略该行的剩余部分;
4. 如果当前不在块注释中,则将当前字符加入 current_line 。
在处理完每一行后,如果当前不在块注释中并且 current_line 不为空,则将 current_line 加入结果列表 result ,并清空 current_line 以便处理下一行。
时间复杂度:
O(n * m)
空间复杂度:
O(n)
代码细节讲解
🦆
在实现中,如果`/*`后紧跟`*/`(如`/**/`),算法如何确保这种情况下正确退出块注释状态?
▷🦆
题解中提到,如果在块注释中遇到`//`,则会被忽略。请问如果在行注释中遇到`/*`,该如何处理?
▷🦆
算法在判断进入块注释(`/*`)时,同时增加了索引`i`,这是否意味着在退出块注释(`*/`)后,紧接着的字符会被忽略?
▷🦆
在处理完每一行后,如果还处于块注释状态,当前行的有效代码(如果有)是否会被错误地丢弃?
▷相关问题
迷你语法分析器
给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger
。
列表中的每个元素只可能是整数或整数嵌套列表
示例 1:
输入:s = "324", 输出:324 解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。
示例 2:
输入:s = "[123,[456,[789]]]", 输出:[123,[456,[789]]] 解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表: 1. 一个 integer 包含值 123 2. 一个包含两个元素的嵌套列表: i. 一个 integer 包含值 456 ii. 一个包含一个元素的嵌套列表 a. 一个 integer 包含值 789
提示:
1 <= s.length <= 5 * 104
s
由数字、方括号"[]"
、负号'-'
、逗号','
组成- 用例保证
s
是可解析的NestedInteger
- 输入中的所有值的范围是
[-106, 106]