LeetCode·每日一题·722. 删除注释·模拟

news2025/1/18 7:19:19

题目

 

示例

 

思路

题意 -> 给定一段代码,将代码中的注释删除并返回。

由于注释只有两种类型:

  • 字符串// 表示行注释,表示//和其右侧的其余字符应该被忽略。
  • 字符串/* 表示一个块注释,它表示直到下一个(非重叠)出现的*/之间的所有字符都应该被忽略。(阅读顺序为从左到右)非重叠是指,字符串/*/并没有结束块注释,因为注释的结尾与开头相重叠。

那么可以直接模拟,逐行分析源代码。每个字符有两种情况,要么在一个注释内要么不在。因此我们用 in_block 变量来标记状态,该变量为 true 表示在注释内,反之则不在。

假设此刻不在注释块内:

  • 遇到 ‘/*’,则将状态改为在注释块内,继续遍历后面第三个字符。
  • 遇到 ‘//’,则直接忽略该行后面的部分。
  • 遇到其他字符,将该字符记录到 new_line 中。 假设此刻在注释块内,遇到 ‘*/’,则将状态改为不在注释块内,继续遍历后面第三个字符。

我们用 new_line 记录新的一行,当遍历到每行的末尾时,如果不在注释块内并且 new_line 不为空,就把它放入答案中。

代码注释超级详细

代码


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
#define MAX_LINE_LEN 80
char ** removeComments(char ** source, int sourceSize, int* returnSize) {
    char **res = (char **)calloc(sourceSize, sizeof(char *));//保存有效值
    char new_line[sourceSize * 100 + 1];//临时数组
    int pos = 0, new_line_pos = 0;
    bool in_block = false;
    for (int j = 0; j < sourceSize; j++) {//遍历代码
        char *line = source[j];//取当前字符串
        int line_size = strlen(line);
        for (int i = 0; i < line_size; i++) {//枚举每一个字符
            if (in_block) {
                //判断注释结束位置
                if (i + 1 < line_size && line[i] == '*' && line[i + 1] == '/') {
                    in_block = false;
                    i++;
                }
            } else {
                //判断注释开始位置
                if (i + 1 < line_size && line[i] == '/' && line[i + 1] == '*') {    
                    in_block = true;
                    i++;
                } else if (i + 1 < line_size && line[i] == '/' && line[i + 1] == '/') {
                    //行注释,直接跳过当前字符串
                    break;
                } else {
                    //有效代码,记录
                    new_line[new_line_pos++] = line[i];
                }
            }
        }
        //存储有效字符串
        if (!in_block && new_line_pos > 0) {
            new_line[new_line_pos] = '\0';
            res[pos] = (char *)calloc(new_line_pos + 1, sizeof(char));
            strcpy(res[pos], new_line);
            pos++;
            new_line_pos = 0;
        }
        *returnSize = pos;
    }
    return res;
}


作者:小迅
链接:https://leetcode.cn/problems/remove-comments/solutions/2370701/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-2ovj/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么设置文件夹密码?文件夹密码设置方法合集

为文件夹设置密码可以有效地保护文件夹的数据安全&#xff0c;那么该怎么设置文件夹密码呢&#xff1f;下面我们来一起了解一下。 文件夹保护3000 想要简单快捷的为文件夹设置密码&#xff0c;那么&#xff0c;文件夹保护3000就是最佳的选择。它提供了3种文件夹保护方式&#…

基于SpringBoot+Vue的CSGO赛事管理系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

<!--富文本接收的位置--><view class"white-box"><view class"title"><view class"yellow-fence"></view><view class"v1">教研记录</view></view><view class"add-btn"…

C语言基础知识——结构体和共用体

1. 结构体 1.1 初识结构体 C语言的结构体是一种自定义的 数据类型&#xff0c;它允许你将不同类型的数据组合在一起&#xff0c;形成一个新的数据类型&#xff0c;以便更方便地管理和操作这些数据。结构体可以包含多个成员&#xff08;也称为字段或属性&#xff09;&#xff0…

使命、愿景、价值观到底有什么区别

以前的企业都是在发展到一定成熟阶段&#xff0c;才开始考虑这三个问题。但今天人们越来越多的意识到&#xff0c;哪怕在企业发展的初期&#xff0c;对于创业企业来说&#xff0c;确定公司的使命、愿景和核心价值观也是非常重要的。 明确的使命、愿景和核心价值观对于企业的好…

搭建k8s集群!!!

注意 k8s集群第一次搭建的话是麻烦且又繁琐的,大家不要着急,静下心来,一步一步搭建即可 linux网关及虚拟机下载不会弄的问题请详细看 linux的搭建及网关配置 这篇文章【也在此专栏】 环境规划 硬件环境 cpu 至少2核 内存 至少3G 硬盘 至少40G 软件环境 操作…

从录取成绩的角度来看,浙大MPA面试的客观公正性是有一定依据的

时间即将来到八月份&#xff01;不知道目前考生们今年的备考情况怎么样了&#xff0c;度过比较煎熬的三伏天&#xff0c;距离考研冲刺的时间越来越近&#xff01; 提前批面试申请对于不同的项目以及不同的考生意义都不一样。比如真正的学霸人物对于提面的申请与不申请一般差别不…

自建HTTP代理池的四大优势

对于爬虫技术人员来说&#xff0c;使用http代理ip可以解决网页访问受限的问题。有人会直接购买成品的HTTP代理池&#xff0c;也有很多人会自己搭建http代理ip进行使用&#xff0c;自建HTTP代理池具有许多特点&#xff0c;为爬虫技术人员提供了有别于使用第三方代理服务的优势。…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Unity 引擎做残影效果——2、屏幕后处理方式

Unity实现残影效果 大家好&#xff0c;我是阿赵。 这里继续介绍Unity里面做残影的方法。之前介绍了BakeMesh的方法做残影&#xff0c;这一期介绍的是用屏幕后处理的方法做残影。 一、原理 之前的BakeMesh方法&#xff0c;是真的生成了很多个网格模型在场景里面。如果用后处理做…

Linux学习之周期性计划任务cron和crontab

crontab -e可以编辑周期性计划任务。在使用此命令编辑的时候&#xff0c;需要要注意每一行有六个字段&#xff0c;使用空格或者Tab键进行隔开&#xff1a; Min Hour Day Month Day_Week commandToExecute - - - - - | | | | | | | | | --…

optee支持哪些密码学算法

GP规范强制要求 GP规范定义可选实现的 optee os实现的 参考:optee_os-3.20.0/lib/libutee/include/tee_api_defines.h 206 /* Algorithm Identifiers */ 207 #define TEE_ALG_AES_ECB_NOPAD 0x10000010 208 #define TEE_ALG_AES_CBC_NOPAD

【面试题】位图

文章目录 位图如何添加数据如何删除数据代码实现给100亿个整数&#xff0c;如何找到只出现一次的数字代码实现给两个文件&#xff0c;分别有100亿个整数&#xff0c;但只有1g内存&#xff0c;如何找到文件的交集&#xff1f;1个文件有100亿个int&#xff0c;1G内存&#xff0c;…

如何使用ArcGIS Pro制作建筑立体效果

虽然ArcGIS Pro已经将二三维场景融合于一个软件之中&#xff0c;但是在某些使用场景下&#xff0c;我们只需要看到建筑的立体效果就行&#xff0c;不用实际的三维建筑效果&#xff0c;毕竟三维的效果对硬件的要求更高&#xff0c;地图的加载效率也没有二维好&#xff0c;所以这…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

住宅小区门禁管理,居然还能这样做!

安全是我们生活中最重要的一环。而在现代社会&#xff0c;门禁监控系统成为了保障居民安全的重要措施之一。 门禁系统利用先进的人脸识别技术&#xff0c;为小区居民带来了更高效、更安全的出入管理体验&#xff0c;更为居民创造了便捷、智能的生活方式。 客户案例 东莞市某花…

Flask项目打包为exe(附带项目资源,静态文件)

1.在项目根目录创建my_app.spec文件&#xff0c;内容如下&#xff1a; # -*- mode: python ; coding: utf-8 -*-block_cipher Nonea Analysis([server.py], # flask入口pathex[],binaries[], datas[("E:/**/templates","/templates"),("E:/**/s…

SpringBoot3 整合Prometheus + Grafana

通过Prometheus Grafana对线上应用进行观测、监控、预警… 健康状况【组件状态、存活状态】Health运行指标【cpu、内存、垃圾回收、吞吐量、响应成功率…】Metrics… 1. SpringBoot Actuator 1. 基本使用 1. 场景引入 <dependency><groupId>org.springframew…

大数据之Hadoop(一)

目录 一、准备三台服务器 二、虚拟机间配置免密登录 三、安装JDK 四、关闭防火墙 五、关闭安全模块SELinux 六、修改时区和自动时间同步 一、准备三台服务器 我们先准备三台服务器&#xff0c;可以通过虚拟机的方式创建&#xff0c;也可以选择云服务器。 关于如何创建虚…

fatal error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译

问题 默认情况下&#xff0c;对象文件最多可存放 65,536 (2^16) 个可寻址的节。 /bigobj将该地址容量增加至 4,294,967,296 (2^32)。大多数模块将从来不会生成包含数超过 65,536 的 .obj 文件。 但是&#xff0c;计算机生成的代码或大量使用模板库的代码可能需要可存放更多节的…