【leetcode】722. Remove Comments
题目如下:
Given a C++ program, remove comments from it. The program
source
is an array wheresource[i]
is thei
-th line of the source code. This represents the result of splitting the original source code string by the newline character\n
.In C++, there are two types of comments, line comments, and block comments.
The string
//
denotes a line comment, which represents that it and rest of the characters to the right of it in the same line should be ignored.The string
/*
denotes a block comment, which represents that all characters until the next (non-overlapping) occurrence of*/
should be ignored. (Here, occurrences happen in reading order: line by line from left to right.) To be clear, the string/*/
does not yet end the block comment, as the ending would be overlapping the beginning.The first effective comment takes precedence over others: if the string
//
occurs in a block comment, it is ignored. Similarly, if the string/*
occurs in a line or block comment, it is also ignored.If a certain line of code is empty after removing comments, you must not output that line: each string in the answer list will be non-empty.
There will be no control characters, single quote, or double quote characters. For example,
source = "string s = "/* Not a comment. */";"
will not be a test case. (Also, nothing else such as defines or macros will interfere with the comments.)It is guaranteed that every open block comment will eventually be closed, so
/*
outside of a line or block comment always starts a new comment.Finally, implicit newline characters can be deleted by block comments. Please see the examples below for details.
After removing the comments from the source code, return the source code in the same format.
Example 1:
Input:
source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"] The line by line code is visualized as below:
/*Test program */
int main()
{
// variable declaration
int a, b, c;
/* This is a test
multiline
comment for
testing */
a = b + c;
} Output: ["int main()","{ "," ","int a, b, c;","a = b + c;","}"] The line by line code is visualized as below:
int main()
{ int a, b, c;
a = b + c;
} Explanation:
The string/*
denotes a block comment, including line 1 and lines 6-9. The string//
denotes line 4 as comments.Example 2:
Input:
source = ["a/*comment", "line", "more_comment*/b"]
Output: ["ab"]
Explanation: The original source string is "a/*comment\nline\nmore_comment*/b", where we have bolded the newline characters.
After deletion, the implicit newline characters are deleted, leaving the string "ab",
which when delimited by newline characters becomes ["ab"].Note:
- The length of
source
is in the range[1, 100]
.- The length of
source[i]
is in the range[0, 80]
.- Every open block comment is eventually closed.
- There are no single-quote, double-quote, or control characters in the source code.
解题思路:这种题目还是很烦的,要考虑的情况比较多。我的方法相对简单粗暴一点,首先设置一个定界符,例如:'#$%@'。然后把所有的换行符都替换成定界符,这样相当于把代码都合并到一行。接下来查找下标最小的'//'和'/*',如果'/*'的下标更小找出在后面最近的'*/',删除掉之间所有字符;否则,找出'//'后面最近的定界符,并且删除到之间的所有字符。循环操作直到所有合法的//'和'/*'都删除掉为止,最后把定界符再替换回换行符。
代码如下:
class Solution(object):
def removeComments(self, source):
"""
:type source: List[str]
:rtype: List[str]
"""
newLine = ''
delimiter = '#$%@'
for i in source:
newLine += i
newLine += delimiter while True:
linecommentStart = newLine.find('//')
blockCommentStart = newLine.find('/*')
if linecommentStart == -1 and blockCommentStart == -1:
break
elif linecommentStart == -1:
blockCommentEnd = newLine.find('*/',blockCommentStart+2)
if blockCommentEnd == -1:
break
newLine = newLine[:blockCommentStart] + newLine[blockCommentEnd+2:]
elif blockCommentStart == -1:
linecommentEnd = newLine.find(delimiter,linecommentStart)
newLine = newLine[:linecommentStart] + newLine[linecommentEnd + 4:]
else:
if linecommentStart < blockCommentStart:
linecommentEnd = newLine.find(delimiter, linecommentStart)
newLine = newLine[:linecommentStart] + newLine[linecommentEnd:]
else:
blockCommentEnd = newLine.find('*/', blockCommentStart + 2)
if blockCommentEnd != -1:
newLine = newLine[:blockCommentStart] + newLine[blockCommentEnd + 2:]
else:
linecommentEnd = newLine.find(delimiter, linecommentStart)
newLine = newLine[:linecommentStart] + newLine[linecommentEnd:]
def filterEmpty(n):
return len(n) > 0 return list(filter(filterEmpty, newLine.split(delimiter)))
【leetcode】722. Remove Comments的更多相关文章
- 【LeetCode】722. Remove Comments 解题报告(Python)
[LeetCode]722. Remove Comments 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/remove-c ...
- 【LeetCode】402. Remove K Digits 解题报告(Python)
[LeetCode]402. Remove K Digits 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...
- 【leetcode】 26. Remove Duplicates from Sorted Array
@requires_authorization @author johnsondu @create_time 2015.7.22 18:58 @url [remove dublicates from ...
- 【leetcode】1233. Remove Sub-Folders from the Filesystem
题目如下: Given a list of folders, remove all sub-folders in those folders and return in any order the f ...
- 【LeetCode】26. Remove Duplicates from Sorted Array 解题报告(Python&C++&Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 日期 [LeetCode] https:// ...
- 【LeetCode】27. Remove Element 解题报告(Python & Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 记录起始位置 日期 题目地址:https:/ ...
- 【LeetCode】1047. Remove All Adjacent Duplicates In String 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 栈 日期 题目地址:https://leetcode ...
- 【LeetCode】316. Remove Duplicate Letters 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】203. Remove Linked List Elements 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双指针 递归 日期 题目地址:https://lee ...
随机推荐
- (转)运行pip报错:Fatal error in launcher: Unable to create process using '"'
转:https://blog.csdn.net/cjeric/article/details/73518782 在新环境上安装python的时候又再次遇到了这个情况,这次留意了一下,发现原来的文章有错 ...
- ZOJ 3822 ( 2014牡丹江区域赛D题) (概率dp)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5376 题意:每天往n*m的棋盘上放一颗棋子,求多少天能将棋盘的每行每列都至少有 ...
- jsc2019_qualE Card Collector
题目大意 给你n个点的坐标和权值 问先在每一行选一个点再在每一列选一个没选过的点 求最大权值和 分析 可以想到将点转化为边,将两个坐标对应两个点 所以问题转化为选H+W个边 使得所有边的度都不为0 则 ...
- SPSS输出结果如何在word中设置小数点前面显示加0
SPSS输出结果如何在word中设置小数点前面显示加0 在用统计分析软件做SPSS分析时,其输出的结果中,如果是小于1(绝对值)的数,那么会默认输出不带小数点的数值.例如0.362和 -0.141被显 ...
- Support Vector Machine(1):线性可分集的决策边界
与Logistuc Regression相比,SVM是一种优化的分类算法,其动机是寻找一个最佳的决策边界,使得从决策边界与各组数据之间存在margin,并且需要使各侧的margin最大化.比较容易理解 ...
- 关于 pip disreubution setuptools(unable to locate package pip)
总是报找不到setuptools模块的错误 很是郁闷 安装pip的前提条件是要安装setuptools 或distribute. 安装distribute的方法: $ curl http://pyth ...
- ELK+Filebeat (2)
ELK+Filebeat收集多台机器不同日志 采坑:在使用了6.0版本的ELK以后,使用如上配置,if [type]匹配不到在filebeat里面使用document_type定义的字符串.在多次调试 ...
- c语言1博客作业12-学期总结
一.我学到的内容 二.收获总结 2.1我的收获 链接: c语言1博客作业01:https://www.cnblogs.com/dy-985211/p/11578914.html c语言1博客作业02: ...
- Linux服务正常启动,Linux服务器能访问,但是外部机器不能访问
公司用到了jenkins,就在自己虚拟机里面部署了一个jenkins.部署成功之后,在Linux虚拟机里面能正常访问,但是外部真实机却不能访问.当时的第一反应就是觉得应该是权限问题,猜测会不会是jen ...
- 70.Trapping Rain Water(容水量)
Level: Hard 题目描述: Given n non-negative integers representing an elevation map where the width of e ...