目录
题目:
示例:
分析:
代码:
这道题属于模拟题,我们实际运用场景是使用正则表达式,并且我看评论区也有不少大佬也是用的正则,而我就是用最土的办法直接模拟了,然后写出了五十多行的屎山代码,我这办法一定不是最好的办法,在这边分享出来也算是给大家提供一种思路,在碰到这类题想不到其他更妙的办法也可以用咱这土办法来做出来。
这道题让我们把代码里的注释删掉,并且不用考虑无效的情况,也不用考虑注释在双引号里的情况,那难度其实不大,就是很磨人,要注意一些细节,一个是处理好注释嵌套的问题,另一个就是行注释可能会把代码里换行符一起注释掉,我们在删除块注释的同时,还需要处理没有换行符而要把两行拼接在一起的情况。
那大概了解情况以后我们就开始按行遍历代码,如果遇到了行注释,那倒比较简单,直接把本行的行注释后面的内容全删了,不过行注释不删换行符,我们不需要做合并代码行的操作。
如果遇到了块注释的开头标记"/*'',那么我们需要做两个操作,一个是记录当前坐标,用于删除注释,另一个是标记接下来的代码属于块注释的范围,只要没遇到块注释的结尾标记,则其他符号都是不用管的.
然后最关键的点在于遇到了块注释的结尾标记我们怎么处理,首先是我们之前有做块注释的开头标记的坐标的缓存,我们把块注释的首尾行号做比较,把它们中间的代码行全变成空字符串,至于为什么不直接删了,这是因为遍历行我们是用的for循环,直接删掉代码行会直接影响代码的行数,会影响for循环,所以我们这边是将删除的代码先变成空字符串,然后最后再遍历一次代码,把空字符串的行都删了.
其次是把块注释的开头标记的那一行代码中开头标记之后的代码删了,还有就是把块注释的结尾标记的那一行中结尾标记之前的代码都删了.
然后如果块注释的开头标记和结尾标记不在同一行,则块注释会把换行符删了,我们需要记录合并代码的那两行的行数.
遍历完代码之后我们还需要做一个收尾工作,第一个就是合并因为块注释删除了换行符而需要合并的两行.
最后就是把代码里的空字符串删除.
因为我们是原地修改的,因此直接把传入进来的代码再返回出去即可.
还有一个办法我就简单提一下,写出来也是屎山代码不过第第一种方法的代码少一点,但是运行速度满了好多.
就是先把代码拼接成一个字符串,然后在每行代码中间穿插一个特殊字符表示换行符,然后在同一行里处理注释会稍微方便一点,不用特地考虑换行符的问题,因为我们把换行符给具象了出来.
然后最后再按照我们设置的特殊字符来分割那个字符串即可.
class Solution {
public:
vector removeComments(vector& source) {
vectorblock(0); //记录块注释的开头坐标
bool haveBolck=false; //记录是不是在块注释中
vector>needMerge; //记录因为块注释删除了换行符而需要合并的两行
for(int i=0;i
//拼接字符串来做处理
string newSourec="";
for(auto& s:source){
newSourec+=s+"&";
}
int index=0;
bool b=false,h=false;
while(indexres;
string temp="";
for(auto& c:newSourec){
if(c=='&'){
if(temp!=""){
res.push_back(temp);
}
temp="";
}else{
temp+=c;
}
}
return res;