做我们自己,并成为我们所能成为的人,是人生唯一的目的。
题目
参考722. 删除注释。
解题思路
-
模拟:遍历枚举字符时,需要判断连续的几个字符确定是否进入注释,以块注释作为主要判断入口,单行注释辅助忽略后面字符,每一行需要结合起来判断:
- 未进入块注释:碰到单行注释忽略后面字符开始新行,否则加入新行存储。
- 进入块注释:跳过该字符,直到遇到块注释结束。
记录上一个字符,当前行结束判断不为空则生成的新行添加到结果队列中。
模拟
class Solution {
public List<String> removeComments(String[] source) {
List<String> ans = new ArrayList<>(); // 模拟
boolean comment = false;// 是否是块注释部分
StringBuilder sb = new StringBuilder(); // 遍历每行字符 生成新行
//char pre = 0;// 前一个字符值 \u0000 使用sb最后一个字符代替
char commentPre = 0;// 注释中的前一个字符值
for (String s : source) {
char[] sc = s.toCharArray();
for (int i = 0; i < sc.length; i++) {
char c = sc[i], pre = sb.length()==0? 0:sb.charAt(sb.length()-1);
if (!comment) {
if (pre == '/' && c == '/') { //清除单行注释
sb.deleteCharAt(sb.length()-1);
break;
} else if (pre == '/' && c == '*') { //进入块注释
comment = true;
sb.deleteCharAt(sb.length()-1);
} else sb.append(c); // 不为注释记录字符
} else {
if(commentPre == '*' && c == '/') { // 解除块注释
comment = false;
commentPre = 0;
}else {
commentPre = c;
}
}
}
if (!comment && sb.length() > 0){ // 不在注释中且不为空加入答案 同时清除栈
ans.add(sb.toString());
sb.delete(0,sb.length());
}
}
return ans;
}
}
复杂度分析
- 时间复杂度:
O(n)
,遍历所有代码字符一次,n
为总字符数。 - 空间复杂度:
O(n)
。
网友评论