领扣(LeetCode)删除注释 个人题解

给一个 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;", "}"]

示例代码可以编排成这样:
/*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;","}"]

编排后:
int main()
{ 

int a, b, c;
a = b + c;
}

解释:
第 1 行和第 6-9 行的字符串 /* 表示块注释。第 4 行的字符串 // 表示行注释。

示例 2:

输入:
source = ["a/*comment", "line", "more_comment*/b"]
输出: ["ab"]
解释: 原始的 source 字符串是 "a/*comment\nline\nmore_comment*/b", 其中我们用粗体显示了换行符。删除注释后,隐含的换行符被删除,留下字符串 "ab" 用换行符分隔成数组时就是 ["ab"].

注意:

  • source的长度范围为[1, 100].
  • source[i]的长度范围为[0, 80].
  • 每个块注释都会被闭合。
  • 给定的源码中不会有单引号、双引号或其他控制字符。

题目本身的逻辑很简单

首先判断是否出现了“//”或者“/*”,如果出现了“//”则忽略掉当前行“//”后的所有内容。如果遇到的是“/*”则做一个标记,直到遇到“*/”,之间的所有内容全部忽略。

但是自己写的时候还是出现了许多问题,没有考虑全上面遇到的情况,导致了错误。比如对优先级的处理不够正确,没有对行进行依次操作。

AC的正确代码参考了https://blog.csdn.net/w8253497062015/article/details/80732789

 1 import java.util.ArrayList;
 2 import java.util.List;
 3
 4 public class Solution {
 5     public List<String> removeComments(String[] source) {
 6         List<String> ans = new ArrayList<>();
 7         StringBuilder sb=new StringBuilder();
 8         int i=0;    //标记操作的source行数
 9         int j=0;    //标记有效字符开始位置
10         boolean isk=false;
11         while(i<source.length)
12         {
13             if(isk)
14             {
15                 int kend=source[i].indexOf("*/",j);
16                 if(kend==-1)
17                 {
18                     i++;
19                     j=0;
20                 }
21                 else
22                 {
23                     isk=false;
24                     j=kend+2;
25                 }
26             }
27             else
28             {
29                 int hmark=source[i].indexOf("//",j);
30                 int kbegin=source[i].indexOf("/*",j);
31                 if(hmark==-1)
32                     hmark=source[i].length();
33                 if(kbegin==-1)
34                     kbegin=source[i].length();
35                 for(int k=j;k<Math.min(hmark, kbegin);k++)    //从有效位置开始把当前行处理完毕
36                 {
37                     sb.append(source[i].charAt(k));
38                 }
39                 if(hmark<=kbegin)
40                 {
41                     if(sb.length()>0)    //加入有效行
42                     {
43                         ans.add(new String(sb));
44                         sb.setLength(0);
45                     }
46                     i++;
47                     j=0;
48                 }
49                 else
50                 {
51                     isk=true;
52                     j=kbegin+2;
53                 }
54             }
55         }
56         return ans;
57     }
58
59 }

原文地址:https://www.cnblogs.com/axiangcoding/p/9904421.html

时间: 2024-11-10 08:33:41

领扣(LeetCode)删除注释 个人题解的相关文章

LeetCode:删除排序数组中的重复项||【80】

LeetCode:删除排序数组中的重复项||[80] 题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1: 给定 nums = [1,1,1,2,2,3], 函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 . 你不需要考虑数组中超出新长度后面的元素. 示例 2: 给定 nums =

LeetCode: Add Two Numbers 题解

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

vim的批量注释与删除注释

vim的批量注释与删除注释 方法一:块选择模式 批量注释: Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的I进入行首插入模式输入注释符号如 // 或 #,输入完毕之后,Vim会自动将你选中的所有行首都加上注释. 如图: 取消注释: Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意// 要选中两个,选好之后按d即可删除注释. 如图: 方法二 替换命令 批量注释: 使用下面命令在指定的行首添加注释: :起始行号,结束行号s/^/注释符/g 取消注释:

vim编辑器批量添加和删除注释

添加注释: 方法一: (1)按Control+v(win下面ctrl+q)进入列模式: (2)按大些"I"进入插入模式,输入注释符"#"或者是"//",然后立刻按下ESC(两下) 方法二:替换命令 :起始行号,结束行号s/^/注释符/g 删除注释: 方法一: Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意// 要选中两个,选好之后按d即可删除注释 方法二: :起始行号,结束行号s/^注释符//g 参考文档: http://b

【LeetCode】【Python题解】Pascal&#39;s Triangle

Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 要求输入一个整数,返回一个表示杨辉三角的数组.我的方法是计算通项公式,首先是编写阶乘函数,然后计算C00,C10,C11即可 利用Python 的map嵌套可以很简洁地实现,核心代码只有一行! class So

LeetCode: Longest Common Prefix 题解

Write a function to find the longest common prefix string amongst an array of strings. 题解: 寻找一组字符串的最长公共前缀.  最简单的方法,用一个字符串记录当前最长的公共前缀,然后依次比较.时间复杂度: O(N). 1 class Solution { 2 public: 3 string getPrefix(string a,string b) // 辅助函数用于获取两个字符串的公共前缀 4 { 5 st

LeetCode: Count and Say 题解

The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ... 1 is read off as "one 1" or 11.11 is read off as "two 1s" or 21.21 is read off as "one 2, then one 1" or 1211. Given an

LeetCode: Roman to Interger 题解

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 找到规则即可 罗马数字的表示: I~1 V~5 X~10 L~50 C~100 D~500 M~1000 规则: 基本数字Ⅰ.X .C 中的任何一个,自身连用构成数目,或者放在大数的右边连用构成数目,都不能超过三个:放在大数的左边只能用一个. 不能把基本数字V .L .D 中的任何一

【LeetCode】【Python题解】Best Time to Buy and Sell Stock II

Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). Ho