当前位置: 首页 > news >正文

【力扣】722. 删除注释

以下为力扣官方题解,及本人代码

722. 删除注释

  • 题目
    • 题意
    • 示例 1
    • 示例 2
    • 提示
  • 官方题解
    • 模拟
      • 思路与算法
      • 复杂度
  • 本人代码
    • Java
    • 提交结果:通过

题目

题意

给一个 C + + C++ C++ 程序,删除程序中的注释。这个程序 s o u r c e source source 是一个数组,其中 s o u r c e [ i ] source[i] source[i] 表示第 i i i 行源码。 这表示每行源码由 \n 分隔。
C + + C++ C++ 中有两种注释风格,行内注释和块注释。

  • 字符串 / / // // 表示行注释,表示 / / // // 和其右侧的其余字符应该被忽略。
  • 字符串 / ∗ /* / 表示一个块注释,它表示直到下一个(非重叠)出现的 ∗ / */ / 之间的所有字符都应该被忽略。(阅读顺序为从左到右)非重叠是指,字符串 / ∗ / /*/ // 并没有结束块注释,因为注释的结尾与开头相重叠。
    第一个有效注释优先于其他注释。
  • 如果字符串 / / // // 出现在块注释中会被忽略。
  • 同样,如果字符串 / ∗ /* / 出现在行或块注释中也会被忽略。
    如果一行在删除注释之后变为空字符串,那么不要输出该行。即,答案列表中的每个字符串都是非空的。
    样例中没有控制字符,单引号或双引号字符。
  • 比如, s o u r c e = " s t r i n g s = " / ∗ N o t a c o m m e n t . ∗ / " ; " source = "string s = "/* Not a comment. */";" source="strings="/Notacomment./";" 不会出现在测试样例里。

此外,没有其他内容(如定义或宏)会干扰注释。
我们保证每一个块注释最终都会被闭合, 所以在行或块注释之外的 / ∗ /* / 总是开始新的注释。
最后,隐式换行符可以通过块注释删除。 有关详细信息,请参阅下面的示例。
从源代码中删除注释后,需要以相同的格式返回源代码。

示例 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 test
multiline
comment for
testing */
a = b + c;
}
1 1 1 行和第 6 − 9 6-9 69 行的字符串 / ∗ /* / 表示块注释。第 4 4 4 行的字符串 / / // // 表示行注释。
编排后:
int main()
{
.
int a, b, c;
a = b + c;
}

示例 2

输入: source = [“a/*comment”, “line”, “more_comment*/b”]
输出: [“ab”]
解释: 原始的 s o u r c e source source 字符串是 “a/*comment\nline\nmore_comment*/b”,其中 \n 是换行符。删除注释后,隐含的换行符被删除,留下字符串 " a b " "ab" "ab" 用换行符分隔成数组时就是 [ " a b " ] ["ab"] ["ab"]

提示

  • 1 < = s o u r c e . l e n g t h < = 100 1 <= source.length <= 100 1<=source.length<=100
  • 0 < = s o u r c e [ i ] . l e n g t h < = 80 0 <= source[i].length <= 80 0<=source[i].length<=80
  • s o u r c e [ i ] source[i] source[i] 由可打印的 A S C I I ASCII ASCII 字符组成。
  • 每个块注释都会被闭合。
  • 给定的源码中不会有单引号、双引号或其他控制字符。

官方题解

模拟

思路与算法

我们需要逐行分析源代码。每个字符有两种情况,要么在一个注释内要么不在。因此我们用 i n _ b l o c k in\_block in_block 变量来标记状态,该变量为 t r u e true true 表示在注释内,反之则不在。
假设此刻不在注释块内:

  • 遇到 ‘ / ∗ /* /’,则将状态改为在注释块内,继续遍历后面第三个字符。
  • 遇到 ‘ / / // //’,则直接忽略该行后面的部分。
  • 遇到其他字符,将该字符记录到 n e w l i n e new_line newline 中。
    假设此刻在注释块内,遇到 ‘ ∗ / */ /’,则将状态改为不在注释块内,继续遍历后面第三个字符。
    我们用 n e w _ l i n e new\_line new_line 记录新的一行,当遍历到每行的末尾时,如果不在注释块内并且 n e w _ l i n e new\_line new_line 不为空,就把它放入答案中。

复杂度

  • 时间复杂度: O ( n m ) O(nm) O(nm)。其中 n n n s o u r c e source source 的长度, m m m s o u r c e [ i ] source[i] source[i] 的最大长度。
  • 空间复杂度: O ( n m ) O(nm) O(nm)。在极端情况下,每一行的隐式换行符都被块注释删除, n e w l i n e new_line newline 的长度将会达到 O ( n m ) O(nm) O(nm)

本人代码

Java

class Solution {public List<String> removeComments(String[] source) {List<String> ans = new ArrayList<>();StringBuilder newStr = new StringBuilder();boolean inBlock = false;for (String line : source) {for (int i = 0; i < line.length(); i++) {if (inBlock) {if (i + 1 < line.length() && line.charAt(i) == '*' && line.charAt(i + 1) == '/') {inBlock = false;//跳过注释符号i++;} } else {if (i + 1 < line.length() && line.charAt(i) == '/' && line.charAt(i + 1) == '*') {//跳过注释符号inBlock = true;i++;} else if (i + 1 < line.length() && line.charAt(i) == '/' && line.charAt(i + 1) == '/') {//跳过单行注释的内容break;} else {newStr.append(line.charAt(i));}}}if (!inBlock && newStr.length() > 0) {ans.add(newStr.toString());//newStr 长度重置为 0,多次使用newStr.setLength(0);}}return ans;}
}

提交结果:通过

  • 执行用时: 0 m s 0ms 0ms
  • 内存消耗: 39.7 M B 39.7MB 39.7MB

相关文章:

【力扣】722. 删除注释

以下为力扣官方题解&#xff0c;及本人代码 722. 删除注释 题目题意示例 1示例 2提示 官方题解模拟思路与算法复杂度 本人代码Java提交结果&#xff1a;通过 题目 题意 给一个 C C C 程序&#xff0c;删除程序中的注释。这个程序 s o u r c e source source 是一个数组&a…...

篇二:工厂方法模式:灵活创建对象

篇二&#xff1a;“工厂方法模式&#xff1a;灵活创建对象” 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&#xff…...

Python(六十二)字典元素的增、删、改操作

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…...

从零学算法138

**138.**给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节…...

CTF PWN练习之返回地址覆盖

今天进行的实验是CTF PWN练习之返回地址覆盖&#xff0c;来体验一下新的溢出方式。 学习地址覆盖之前还有些小知识需要掌握&#xff0c;不然做题的时候你肯定一脸懵逼,首先是函数调用约定&#xff0c;然后还要知道基本的缓冲区溢出攻击模型。 函数调用约定 函数调用约定描述…...

OpenCV中图像变换

一、介绍 transform()&#xff1a;Transposes a matrix. perspectiveTransform()&#xff1a;Performs the perspective matrix transformation of vectors. warpAffine()&#xff1a;Applies an affine transformation to an image. warpPerspective()&#xff1a;Applies a p…...

wordpress发表文章时报错: rest_cannot_create,抱歉,您不能为此用户创建文章(已解决)

使用wordpress 的rest api发布文章&#xff0c;首先使用wp-json/jwt-auth/v1/token接口获取token&#xff0c;然后再使用/wp-json/wp/v2/posts 接口发表文章&#xff0c;但是使用axios请求时&#xff0c;却报错&#xff1a; 但是&#xff0c;我在postman上却是可以的&#xff0…...

数学建模学习(7):Matlab绘图

一、二维图像绘制 1.绘制曲线图 最基础的二维图形绘制方法&#xff1a;plot -plot命令自动打开一个图形窗口Figure&#xff1b; 用直线连接相邻两数据点来绘制图形 -根据图形坐标大小自动缩扩坐标轴&#xff0c;将数据标尺及单位标注自动加到两个坐标轴上&#xff0c;可自定…...

CSS中所有选择器详解

文章目录 一、基础选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 二、复合选择器1.交集选择器2.并集选择器 三、属性选择器1.[属性]2.[属性属性值]3.[属性^属性值]4.[属性$属性值]5.[属性*属性值] 四、关系选择器1.父亲>儿子2.祖先 后代3.兄弟4.兄~弟 五、伪类选择…...

STM32 低功耗学习

STM32 电源系统结构介绍 电源系统&#xff1a;VDDA供电区域、VDD供电区域、1.8V供电区域、后备供电区域。 器件的工作电压&#xff08;VDD&#xff09;2.0~3.6V 为了提高转换精度&#xff0c;给模拟外设独立供电。电压调节器为1.8V供电区域供电&#xff0c;且1.8V供电区域是电…...

HCIP--云计算题库 V5.0版本

在国家政策的支持下&#xff0c;我国云计算应用市场发展明显加快&#xff0c;越来越多的企业开始介入云产业&#xff0c;出现了大量的应用解决方案&#xff0c;云应用的成功案例逐渐丰富&#xff0c;用户了解和认可程度不断提高&#xff0c;云计算产业发展迎来了“黄金机遇期”…...

小白到运维工程师自学之路 第六十五集 (docker-compose)

一、概述 Docker Compose 的前身是 Fig&#xff0c;它是一个定义及运行多个 Docker 容器的工具。可以使用YAML文件来配置应用程序的服务。然后&#xff0c;使用单个命令&#xff0c;您可以创建并启动配置中的所有服务。Docker Compose 会通过解析容器间的依赖关系&#xff08;…...

量子机器学习

量子机器学习(QML)是结合量子计算和机器学习的交叉领域&#xff0c;旨在利用量子计算的优势来改进机器学习算法的性能。下面是一些有关量子机器学习的学习资源和技术应用&#xff1a; 学术论文和研究资料&#xff1a; ArXiv.org&#xff1a;在ArXiv的量子物理和机器学习类别中&…...

WEB集群——tomcat

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 一、简述静态网页和动态网页的区别 &#xff08;1&#xff09;静态网页 1.什么是静态网页 请求响应信息&#xff0c;发…...

Vulnhub: blogger:1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.176 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.176 在80端口的/assets/fonts/目录下发现blog目录&#xff0c;访问后发现为wordpress 利用wpscan发现wordpress插件wpdisc…...

老版MFC工程迁移到VC2019编译EXE太大的问题

有个老版静态链接MFC库的MFC程序需要迁移到VC2019编译&#xff0c;直接用VC2019打开就会自动迁移过去&#xff0c;然后编译一下&#xff0c;生成的EXE大小将近3MB&#xff0c;老版的工程编译出来也就600多KB。 肯定哪里不对劲&#xff01; 好一顿研究之后发现原来默认会把MFC…...

Curve深陷安全事件,OKLink如何破局

出品&#xff5c;欧科云链研究院 作者&#xff5c;Matthew Lee 7月31号&#xff0c;Curve 在平台表示 Vyper 0.2.15 的稳定币池由于编译器的漏洞所以遭到攻击。具体因为重入锁功能的失效&#xff0c;所以黑客可以轻易发动重入攻击&#xff0c;即允许攻击者在单次交易中执行某…...

2023华数杯数学建模思路A题B题C题模型代码分析

目录 一.2023华数杯数学建模最新思路&#xff1a;比赛开始后第一时间更新 更新查看文末名片 二.往年华数杯赛题简介分析&#xff1a; 一.2023华数杯数学建模最新思路&#xff1a;比赛开始后第一时间更新 更新查看文末名片 二.往年华数杯赛题简介分析&#xff1a; 2022华数杯…...

el-table合并单元格

el-tabel数据结构 此处为this.rolePermitItemList 合并后的样式&#xff1a; el-table-column 需要添加property字段&#xff0c;属性值同props&#xff0c;用来判断需要合并的字段 <el-table :data"rolePermitItemList" style"width: calc(100% );margi…...

html5设置不缓存

<meta http-equiv"Cache-Control" content"no-cache, no-store, must-revalidate"> <meta http-equiv"Pragma" content"no-cache"> <meta http-equiv"Expires" content"0"> 使用meta元素的htt…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...