【LeetCode 算法】Remove Comments 删除注释-模拟

这篇具有很好参考价值的文章主要介绍了【LeetCode 算法】Remove Comments 删除注释-模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Remove Comments 删除注释

问题描述:

给一个 C++ 程序,删除程序中的注释。这个程序source是一个数组,其中source[i]表示第 i 行源码。 这表示每行源码由 ‘\n’ 分隔。

在 C++ 中有两种注释风格,行内注释和块注释。

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

如果字符串//出现在块注释中会被忽略。
同样,如果字符串/*出现在行或块注释中也会被忽略。
如果一行在删除注释之后变为空字符串,那么不要输出该行。即,答案列表中的每个字符串都是非空的。

样例中没有控制字符,单引号或双引号字符。

比如,source = “string s = “/* Not a comment. */”;” 不会出现在测试样例里。
此外,没有其他内容(如定义或宏)会干扰注释。

我们保证每一个块注释最终都会被闭合, 所以在行或块注释之外的/*总是开始新的注释。

最后,隐式换行符可以通过块注释删除。 有关详细信息,请参阅下面的示例。

从源代码中删除注释后,需要以相同的格式返回源代码。

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

分析

一个模拟问题.

对于每一行代码,有可能存在注释,块注释或者是行注释.
也可能不存在注释,但是需要注意即使本行不存在注释,它也有可能属于块注释的一部分.

如果之前没有出现过块注释,那么接下来的代码中可能出现 纯代码 , 第一个块注释,行注释,代码+注释等,

  • 纯代码,就是决对不会出现 / / , / ∗ //,/* //,/, 由于之前没有注释,所以这里不会出现 ∗ / */ /.
  • 行注释,此位置后的都可以忽略。
  • 第一部分块注释,即 / ∗ /* /会出现,那么需要找到他的结尾 ∗ / */ /,end 可能在当前行尾,或者是下面的某行中。

为了解决这个问题,官方的思路,比较精简,它将块注释使用标记,那么字符要么在注释内,要么不在注释内。而行注释可以直接删除后面的内容。

  • 如果 i n B l o c k = t r u e , inBlock=true, inBlock=true,表示处于块注释中,非注释标记的字符都不会加入字符串,而且只需要关心是否会遇到*/,从而结束块注释。
  • 如果 i n B l o c k = f a l s e , inBlock=false, inBlock=false,表示不在块注释中,也就是说 当前行中可能有代码,也有可能有行注释,当然也有可能遇到 块注释的开始位置。

如果一行处理完成,只有当不处于块注释的状态下并且字符串不为空的情况下,才会进行输出,同时还要清空字符串。

代码

public List<String> removeComments(String[] source) {
        boolean inBlock = false;
        StringBuilder newline = new StringBuilder();
        List<String> ans = new ArrayList();
        for (String line: source) {
            int i = 0;
            char[] chars = line.toCharArray();
            if (!inBlock) newline = new StringBuilder();
            while (i < line.length()) {
                if (!inBlock && i+1 < line.length() && chars[i] == '/' && chars[i+1] == '*') {
                    inBlock = true;
                    i++;
                } else if (inBlock && i+1 < line.length() && chars[i] == '*' && chars[i+1] == '/') {
                    inBlock = false;
                    i++;
                } else if (!inBlock && i+1 < line.length() && chars[i] == '/' && chars[i+1] == '/') {
                    break;
                } else if (!inBlock) {
                    newline.append(chars[i]);
                }
                i++;
            }
            if (!inBlock && newline.length() > 0) {
                ans.add(new String(newline));
            }
        }
        return ans;
    }

时间复杂度 O ( M N ) O(MN) O(MN)

空间复杂度 O ( M N ) O(MN) O(MN)

Tag

Array

String文章来源地址https://www.toymoban.com/news/detail-624554.html

到了这里,关于【LeetCode 算法】Remove Comments 删除注释-模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mongodb 删除文档Delete与Remove的区别

    db.collection.remove() 此方法已被 mongosh 弃用 已弃用的方法 替代方法 db.collection.remove() db.collection.deleteOne() db.collection.deleteMany() db.collection.findOneAndDelete() db.collection.bulkWrite() 5.0版本更改。 db.collection.remove() 方法可以具有两种语法之一。 remove()方法可以采用查询文档和可选的 justOn

    2024年02月11日
    浏览(40)
  • JavaScript删除元素、移除、remove、removeChild、querySelector

    方法1.1 方法1.2 方法2.1 方法2.2 记得给子元素做冒泡处理 MDN Element.remove 方法,把对象从它所属的 DOM 树中删除。 w3school remove 方法从文档中删除元素(或节点)。 元素或节点是从文档对象模型( DOM )中删除的。 w3school removeChild 方法删除元素的子节点。 该方法以 Node 对象返回被删除

    2024年02月11日
    浏览(40)
  • leetcode - 27. Remove Element

    Given an integer array nums and an integer val, remove all occurrences of val in nums in-place. The order of the elements may be changed. Then return the number of elements in nums which are not equal to val. Consider the number of elements in nums which are not equal to val be k, to get accepted, you need to do the following things: Change the array nums su

    2024年02月09日
    浏览(29)
  • 【经典算法】 leetcode88.合并排序的数组(Java/C/Python3实现含注释说明,Easy)

    作者主页: 🔗进朱者赤的博客 精选专栏:🔗经典算法 作者简介:阿里非典型程序员一枚 ,记录在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法( 公众号同名 ) ❤️觉得文章还不错的话欢迎大家点赞👍➕收藏⭐️➕评论,💬支持博主,记得点个大大的 关

    2024年04月22日
    浏览(38)
  • 【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)

    标签(题目类型):回文串、动态规划 原题:LeetCode 5 思路 Dynamic Programming(DP) 动态规划是一种将问题分解成子问题并分别计算的优化技术。对于回文子串,我们可以使用动态规划来解决。 对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后

    2024年04月14日
    浏览(66)
  • 数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

      头文件和源文件分开有很多好处:可以提高编译速度、提高代码的可维护性、提高代码的可重用性和可扩展性,同时也可以使代码结构更清晰,方便代码的管理和维护。 LinkList.h test.cpp                  (下面所有函数都默认在类中实现)   我们以

    2024年02月07日
    浏览(54)
  • Appium-Remove App(卸载/删除应用程序)

    Remove an app from the device Example Usage Java driver.removeApp( \\\"com.example.AppName\\\" ); Python self.driver.remove_app( \\\'com.example.AppName\\\' ); Javascript // webdriver.io example driver.removeApp( \\\'com.example.AppName\\\' ) // wd example await driver.removeAppFromDevice( \\\'com.example.AppName\\\' ); Ruby # ruby_lib example remove_app( \\\'com.example.AppName\\\' ) #

    2023年04月09日
    浏览(37)
  • 【数据结构和算法】删除链表的中间节点

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、复杂度分析 这是力扣的 2095 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。 慢慢开始链表的模块了

    2024年01月19日
    浏览(74)
  • 【数据结构与算法】单链表的插入和删除

    🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏: 数据结构与算法 🌠 首发时间:2022年9月21日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 🌟 一以贯之的努力 不得懈怠的人生 众所周知,顺序表中的每个结点中只存放数据元素,其优缺点为: 优点:可随机存取,存储

    2024年02月07日
    浏览(39)
  • LeetCode83. Remove Duplicates from Sorted List

    Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well. Example 1: Input: head = [1,1,2] Output: [1,2] Example 2: Input: head = [1,1,2,3,3] Output: [1,2,3] Constraints: The number of nodes in the list is in the range [0, 300]. -100 = Node.val = 100 The list is guaranteed t

    2024年01月18日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包