中国网站建设公司排行,定制产品网站,广告设计软件免费下载,网站开发人员上级主管删除注释
题目
给一个 C 程序#xff0c;删除程序中的注释。这个程序source是一个数组#xff0c;其中source[i]表示第 i 行源码。 这表示每行源码由 ‘\n’ 分隔。
在 C 中有两种注释风格#xff0c;行内注释和块注释。
字符串// 表示行注释#xff0c;表示//和其右侧…删除注释
题目
给一个 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 100
0 source[i].length 80
source[i] 由可打印的 ASCII 字符组成。
每个块注释都会被闭合。
给定的源码中不会有单引号、双引号或其他控制字符。思路
设置一个值来记录是否在注释代码块里面这里是c初始值为false。 设置一个存储有效字符的StringBuilder对象sb将有效字符追加到这里面。 然后分类讨论字符是否是有效字符 1.当第i个字符和第i1个字符组成是/“,说明是块级注释的开始将condition设置为true然后跳过这两个字符。 2.当第i个字符和第i1个字符组成是”/“,说明是块级注释的结束将condition设置为false,然后跳过这两个字符。 3.当第i个字符和第i1个字符组成是”//,说明是行注释的开始直接break掉因为此时后面的都是不要的。 4.除此之外的情况都是有效字符追加到sb中 遍历一个字符串结束后判断condition状态为false说明不在代码块里面我们直接将sb添加进入答案ans中如果condition为true说明此时代码块还没有结束我们继续遍历下一个字符串。 如这种a/*comment, line, more_comment*/b
测试代码
class Solution{public ListString removeComments(String[] source) {ListStringansnew ArrayList();boolean conditionfalse;StringBuilder sbnew StringBuilder();for (String s :source) {int lens.length();for (int i 0; ilen; i) {if (condition) {if (i1lens.charAt(i)* s.charAt(i1)/){condition false;//这里的i加上循环的i就把这两个字符字节跳过了i;}} else if (i1lens.charAt(i)/ s.charAt(i1)*) {condition true;i;} else if (i1lens.charAt(i)/ s.charAt(i1)/) {break;} else {sb.append(s.charAt(i));}}if (!conditionsb.length()0){ans.add(sb.toString());sb.setLength(0);}}return ans;}
}复杂度
时间复杂度 O(n*m) 空间复杂度O(n)
执行结果