景泰做网站,床品图案设计网站,网络优化师自学网站,怎样建设网站最好目录链接#xff1a;
力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目#xff1a;
https://github.com/September26/java-algorithms 原题链接#xff1a;力扣 描述#xff1a;
给一个 C 程序#xff0c;删除程序中的注释。这个程序source是一个数组#x…目录链接
力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目
https://github.com/September26/java-algorithms 原题链接力扣 描述
给一个 C 程序删除程序中的注释。这个程序source是一个数组其中source[i]表示第 i 行源码。 这表示每行源码由 \n 分隔。
在 C 中有两种注释风格行内注释和块注释。
字符串// 表示行注释表示//和其右侧的其余字符应该被忽略。字符串/* 表示一个块注释它表示直到下一个非重叠出现的*/之间的所有字符都应该被忽略。阅读顺序为从左到右非重叠是指字符串/*/并没有结束块注释因为注释的结尾与开头相重叠。
第一个有效注释优先于其他注释。
如果字符串//出现在块注释中会被忽略。同样如果字符串/*出现在行或块注释中也会被忽略。
如果一行在删除注释之后变为空字符串那么不要输出该行。即答案列表中的每个字符串都是非空的。
样例中没有控制字符单引号或双引号字符。
比如source string s /* Not a comment. */; 不会出现在测试样例里。
此外没有其他内容如定义或宏会干扰注释。
我们保证每一个块注释最终都会被闭合 所以在行或块注释之外的/*总是开始新的注释。
最后隐式换行符可以通过块注释删除。 有关详细信息请参阅下面的示例。
从源代码中删除注释后需要以相同的格式返回源代码。 示例 1:
输入: source [/*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;,}]
解释: 示例代码可以编排成这样:
/*Test program */
int main()
{ // variable declaration
int a, b, c;
/* This is a testmultiline comment for testing */
a b c;
}
第 1 行和第 6-9 行的字符串 /* 表示块注释。第 4 行的字符串 // 表示行注释。
编排后:
int main()
{ int a, b, c;
a b c;
}
示例 2:
输入: source [a/*comment, line, more_comment*/b]
输出: [ab]
解释: 原始的 source 字符串是 a/*comment\nline\nmore_comment*/b, 其中我们用粗体显示了换行符。删除注释后隐含的换行符被删除留下字符串 ab 用换行符分隔成数组时就是 [ab].提示:
1 source.length 1000 source[i].length 80source[i] 由可打印的 ASCII 字符组成。每个块注释都会被闭合。给定的源码中不会有单引号、双引号或其他控制字符。 解题思路
我们设置4个变量
lineNum:代表读到了第多少行
lineIndex:代表读到了一行中的位置
isMultiMatch:前面是否处于/*匹配状态
outLine:前面累计的字符串读每一行的时候分为两种场景
前面已经有/*匹配这时从lineIndex位置往后寻找*/如果存在isMultiMatch状态为false并且设置lineIndex为当前位置。如果不存在则跳转到下一行并且设置lineIndex为0
正常情况则匹配和/*和//看哪个更靠前优先哪个。
//情况下则截取lineIndex到//位置之间的字符串添加到outLine中并且存储outLine跳转到下一行
/*情况下则截取lineIndex到/*位置之间的字符串添加到outLine中
否则记录outLine并且跳转下一行。
这里其实//和/*可以做一个合并这里暂且就不合了。
代码
class Solution722
{
public:void add2List(vectorstring out, string str){if (str.size() 0){return;}out.push_back(str);str ;}vectorstring removeComments(vectorstring source){vectorstring out; // 输出结果// 是否/*已经开始匹配bool isMultiMatch false;int lineNum 0; // 第几行int lineIndex 0; // 一行中的位置string outLine;while (lineNum source.size()){string line source[lineNum];if (isMultiMatch){size_t index line.find(*/, lineIndex);if (index ! std::string::npos){isMultiMatch false;lineIndex index 2;}else{lineNum;lineIndex 0;}}else{size_t index1 line.find(//, lineIndex);size_t index2 line.find(/*, lineIndex);if (index2 ! std::string::npos index2 index1){outLine.append(line.substr(lineIndex, index2 - lineIndex));lineIndex index2 2;isMultiMatch true;}else if (index1 ! std::string::npos index1 index2){outLine.append(line.substr(lineIndex, index1 - lineIndex));add2List(out, outLine);lineNum;lineIndex 0;}else{outLine.append(line.substr(lineIndex));add2List(out, outLine);lineNum;lineIndex 0;}}}add2List(out, outLine);return out;}
};