【力扣每日一题】2023.8.3 删除注释

news2025/1/19 7:52:47

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

这道题属于模拟题,我们实际运用场景是使用正则表达式,并且我看评论区也有不少大佬也是用的正则,而我就是用最土的办法直接模拟了,然后写出了五十多行的屎山代码,我这办法一定不是最好的办法,在这边分享出来也算是给大家提供一种思路,在碰到这类题想不到其他更妙的办法也可以用咱这土办法来做出来。

这道题让我们把代码里的注释删掉,并且不用考虑无效的情况,也不用考虑注释在双引号里的情况,那难度其实不大,就是很磨人,要注意一些细节,一个是处理好注释嵌套的问题,另一个就是行注释可能会把代码里换行符一起注释掉,我们在删除块注释的同时,还需要处理没有换行符而要把两行拼接在一起的情况。

那大概了解情况以后我们就开始按行遍历代码,如果遇到了行注释,那倒比较简单,直接把本行的行注释后面的内容全删了,不过行注释不删换行符,我们不需要做合并代码行的操作。

如果遇到了块注释的开头标记"/*'',那么我们需要做两个操作,一个是记录当前坐标,用于删除注释,另一个是标记接下来的代码属于块注释的范围,只要没遇到块注释的结尾标记,则其他符号都是不用管的.

然后最关键的点在于遇到了块注释的结尾标记我们怎么处理,首先是我们之前有做块注释的开头标记的坐标的缓存,我们把块注释的首尾行号做比较,把它们中间的代码行全变成空字符串,至于为什么不直接删了,这是因为遍历行我们是用的for循环,直接删掉代码行会直接影响代码的行数,会影响for循环,所以我们这边是将删除的代码先变成空字符串,然后最后再遍历一次代码,把空字符串的行都删了.

其次是把块注释的开头标记的那一行代码中开头标记之后的代码删了,还有就是把块注释的结尾标记的那一行中结尾标记之前的代码都删了.

然后如果块注释的开头标记和结尾标记不在同一行,则块注释会把换行符删了,我们需要记录合并代码的那两行的行数.

遍历完代码之后我们还需要做一个收尾工作,第一个就是合并因为块注释删除了换行符而需要合并的两行.

最后就是把代码里的空字符串删除.

因为我们是原地修改的,因此直接把传入进来的代码再返回出去即可.

还有一个办法我就简单提一下,写出来也是屎山代码不过第第一种方法的代码少一点,但是运行速度满了好多.

就是先把代码拼接成一个字符串,然后在每行代码中间穿插一个特殊字符表示换行符,然后在同一行里处理注释会稍微方便一点,不用特地考虑换行符的问题,因为我们把换行符给具象了出来.

然后最后再按照我们设置的特殊字符来分割那个字符串即可.

代码:

class Solution {
public:
    vector<string> removeComments(vector<string>& source) {
        vector<int>block(0);    //记录块注释的开头坐标
        bool haveBolck=false;   //记录是不是在块注释中
        vector<vector<int>>needMerge;   //记录因为块注释删除了换行符而需要合并的两行
        for(int i=0;i<source.size();i++){
            int j=0;
            while(j<source[i].size()){  //因为遍历每行可能会删除一些元素,会改变source[i]的大小所以不能用for
                if(source[i][j]=='*'&&haveBolck&&source[i][j+1]=='/'){  //如果遇到了块注释的末尾,并且正在块注释中,则开始删除块注释
                    for(int c=block[0]+1;c<i;c++){
                        source[c]="";
                    }
                    if(block[0]+1<i) needMerge.push_back({block[0],i}); //记录需要合并的两行
                    if(block[0]==i){    //如果块注释在同一行
                        source[i].erase(block[1],j-block[1]+2);
                        j=block[1];
                    }else { //如果块注释不在 同一行
                        source[block[0]].erase(block[1],source[block[0]].size()-block[1]);
                        source[i].erase(0,j+2);
                        j=0;
                    }
                    haveBolck=false;
                    continue;
                }
                if(haveBolck){  //如果不是上面块注释的末尾,并且处于块注释中,直接跳过
                    j++;
                    continue;
                }
                if(source[i][j]=='/'){  //有/直接检查是否有注释
                    if(source[i][j+1]=='/'){    //行注释直接删除本行后面的部分
                        source[i].erase(j,source[i].size()-j);
                        break;
                    }else if(source[i][j+1]=='*'){  //块注释记录开头的坐标
                        haveBolck=true;
                        block={i,j};
                    }
                    j++;
                }
                j++;
            }
        }
        for(auto& a:needMerge){ //合并需要合并的行
            source[a[0]]+=source[a[1]];
        }
        for(int i=0;i<needMerge.size();i++){    //清除合并行之间的最后一行,因为上面合并是把下面的行加到上面的行
            source.erase(source.begin()+needMerge[i][1]+i);
        }
        int index=0;
        while(index<source.size()){ //清除空字符串的行
            if(source[index]=="") source.erase(source.begin()+index);
            else index++;
        }
        return source;
    }
};
//拼接字符串来做处理
        string newSourec="";
        for(auto& s:source){
            newSourec+=s+"&";
        }
        int index=0;
        bool b=false,h=false;
        while(index<newSourec.size()){
            if(b||h){
                if(h&&newSourec[index]=='&'){
                    index++;
                    h=false;
                }else if(b&&newSourec[index]=='*'&& newSourec[index+1]=='/'){
                    b=false;
                    newSourec.erase(index,2);
                }else{
                    newSourec.erase(index,1);
                }
                continue;
            }
            if(newSourec[index]=='/'){
                if(newSourec[index+1]=='/'){
                    newSourec.erase(index--,2);
                    h=true;
                }else if(newSourec[index+1]=='*'){
                    newSourec.erase(index--,2);
                    b=true;
                }
            }
            index++;
        }
        vector<string>res;
        string temp="";
        for(auto& c:newSourec){
            if(c=='&'){
                if(temp!=""){
                    res.push_back(temp);
                }
                temp="";
            }else{
                temp+=c;
            }
        }
        return res;

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

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

相关文章

如何解决电脑无声问题:排除故障的几种常见方法

大家好&#xff0c;今天我们来讨论一下处理电脑没有声音的故障。当你突然发现电脑静音无声时&#xff0c;需要逐步排除可能的问题&#xff0c;但总体而言&#xff0c;声音故障是相对容易解决的。接下来&#xff0c;我们将介绍一些排除电脑无声问题的方法。 第一步&#xff1a;…

【css】使用float实现水平导航栏

该实例使用float 浮动实现元素浮动在水平方向&#xff0c;从而实现水平导航栏效果。 overflow: hidden&#xff1a;当不给父级元素设置高度的时候&#xff0c;其内部元素浮动后会导致下面的元素顶上去&#xff0c;这是因为子元素浮动后&#xff0c;子元素脱离标准流&#xff0…

SpringBoot读取mysql

SpringBoot读取mysql 部署mysql创建SpringBoot工程增加mysql8依赖创建Service代码执行验证 部署mysql 部署mysql可以通过软件安装&#xff0c;也可以通过docker安装&#xff0c;具体的安装过程可以参考以前的一篇博文&#xff0c;这里不再重复。 《眼睛说&#xff1a;我会用do…

软考A计划-系统集成项目管理工程师-项目合同管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

大模型时代下,算法工程师发展趋势及技术拓展

本文目录 写在前面的话一、人工智能算法工程师的每个阶段是怎么样的&#xff1f;阶段一&#xff1a;模式识别阶段&#xff08;1&#xff09;传统机器学习--支持向量机&#xff08;2&#xff09;传统机器学习--隐马尔可夫模型&#xff08;3&#xff09;新的开始&#xff01;--Al…

小鹏智驾一号位换帅,接棒者李力耘其人

作者 | 张祥威编辑 | 德新 8月2日&#xff0c;小鹏汽车自动驾驶副总裁吴新宙将离职的消息在业界刷屏。到晚间&#xff0c;何小鹏发文确认了这一消息。 接下来&#xff0c;何小鹏将亲自带领自动驾驶和研发团队&#xff0c;为在今年年内完成 CNGP覆盖 50 城的努力&#xff0c;并且…

WEB集群——http、tomcat

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

一文说清楚支付架构

作者&#xff1a;陈斌 支付的技术架构是为了保障能够顺利处理支付请求而设计的结构体系。从系统的角度看&#xff0c;它包括了计算机系统的软件、硬件、网络和数据等。从参与的主体角度来看&#xff0c;它涉及交易的付款方、收款方、支付机构、银行、卡组织和金融监管机构等。要…

批量计算直角三角形两个直角边对应斜边的numpy.hypot()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 给出多个三角形的两条直角边长度 批量计算出这些三角形的斜边长度 numpy.hypot() [太阳]选择题 以下代码的输出结果是? import numpy as np a np.array([3, 4, 30]) b np.array([4, 3, 40])…

第四章 数据库安全性

问题的提出 &#xff08;1&#xff09;数据库的一大特点是数据可以共享 &#xff08;2&#xff09;数据共享必然带来数据库的安全性问题 &#xff08;3&#xff09;数据库系统中的数据共享不能是无条件的共享 这就引发了数据库安全性问题 1.数据库安全性概述 数据库的安全性…

基于SpringBoot+Vue的漫画网站设计与实现(源码+LW+部署文档等)

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

利用 Python 结合 UI 来模拟实现多人聊天

一、界面功能展示 1、设置一个通信 用户1 2、设置通信 用户2 3、进入聊天功能界面 4、发送信息来实现实时通信 二、代码实现 1、服务器端 &#xff08;服务器需要能够与客户机进行直接通信&#xff0c;客户机之间不需要能够通信&#xff09; 服务器需要配置监听的IP 0.0.…

改进粒子群算法优化BP神经网络---回归+分类两种案例

今天采用改进的粒子群算法(LPSO)优化算法优化BP神经网络。本文选用的LPSO算法是之前作者写过的一篇文章&#xff1a;基于改进莱维飞行和混沌映射&#xff08;10种混沌映射随意切换&#xff09;的粒子群优化算法&#xff0c;附matlab代码 文章一次性讲解两种案例&#xff0c;回归…

Mr. Cappuccino的第58杯咖啡——MacOS配置Maven和Java环境

MacOS配置Maven和Java环境 查看Mac使用的是哪个shell下载并准备Maven下载Maven配置前准备 下载并安装JDK下载JDK安装JDK 配置Maven和Java环境添加配置加载配置 验证环境 查看Mac使用的是哪个shell echo $SHELL如果使用的是bash&#xff0c;则使用以下命令 open ~/.bash_profi…

Java课题笔记~ MyBatis接口开发(代理开发)

使用XML文件进行开发&#xff0c;在调用SqlSession进行操作时&#xff0c;需要指定MyBatis映射文件中的方法&#xff0c;这种调用方式过于烦琐。为解决此问题&#xff0c;MyBatis提供了接口开发的方式。 接口开发的目的&#xff1a; 解决原生方式中的硬编码 简化后期执行SQL …

PHP语言基础知识(超详细)

文章目录 前言第一章 PHP语言学习介绍 1.1 PHP部署安装环境1.2 PHP代码工具选择 第二章 PHP代码基本语法 2.1 PHP函数知识介绍2.2 PHP常量变量介绍 2.2.1 PHP变量知识&#xff1a;2.2.2 PHP常量知识&#xff1a; 2.3 PHP注释信息介绍2.4 PHP数据类型介绍 2.4.1 整形数据类型2.4…

【elementui】解决el-select组件失去焦点blur事件每次获取的是上一次选中值的问题

目录 【问题描述】 【问题摘要】 【分析问题】 【完整Test代码】 【封装自定义指令】 ↑↑↑↑↑↑↑↑↑↑↑↑ 不想看解决问题过程的可点击上方【封装自定义指令】目录直接跳转获取结果即可~~~ 【问题描述】 一位朋友遇到这么一个开发场景&#xff1a;在表格里面嵌入el-…

Packet Tracer - 配置初始交换机设置

Packet Tracer - 配置初始交换机设置 拓扑 目标 第 1 部分&#xff1a;检验默认交换机配置 第 2 部分&#xff1a;配置基本交换机配置 第 3 部分&#xff1a;配置 MOTD 标语 第 4 部分&#xff1a;将配置文件保存到 NVRAM 第 5 部分&#xff1a;配置 S2 拓扑图 背景信息…

【Mybatis】XML映射文件

目录 11.3XML映射文件 1.select 2.insert、update、delete 3.Sql 4.parameters(参数) 5.resultMap 6.resultMap 使用示例 (1)在先前创建的数据库stu中创建表student 2&#xff0c;并插入若干条数据&#xff0c;代码如下&#xff1a; (2)创建工程mybatis_ResultMap_demo。 (…

Qt项目---简单的计算器

在这篇技术博客中&#xff0c;我们将介绍如何使用Qt框架实现一个简单的计算器应用。我们将使用C编程语言和Qt的图形用户界面库来开发这个应用&#xff0c;并展示如何实现基本的算术操作。 项目设置 首先&#xff0c;我们需要在Qt Creator中创建一个新的Qt Widgets应用程序项目…