722. Remove Comments

LeetCode medium original: C# #array #csharp #leetcode #medium #string
O texto da tarefa é traduzido do russo para o idioma selecionado. O código permanece sem alterações.

Дана программа на C++, удалите из нее комментарии. Исходный текст программы представляет собой array строк source, где source[i] - это i-я string исходного кода. Это результат разбиения исходной строки исходного кода символом новой строки '\n'. В C++ существует два типа комментариев: строчные и блочные. string "//" обозначает строчный комментарий, который означает, что он и остальные символы справа от него в той же строке должны игнорироваться. string "/*" обозначает блочный комментарий, который означает, что все символы до следующего (не перекрывающегося) вхождения "*/" должны игнорироваться. (Здесь вхождения происходят в порядке чтения: string за строкой слева направо.) Чтобы было понятно, string "/*/" еще не завершает блочный комментарий, так как окончание будет перекрывать начало. Первый эффективный комментарий имеет приоритет над остальными.

НаExemplo, если string "//" встречается в блочном комментарии, она игнорируется. Аналогично, если string "/*" встречается в строчном или блочном комментарии, она также игнорируется. Если после удаления комментариев определенная string кода оказывается пустой, вы не должны выводить эту строку: каждая string в списке ответов будет непустой.

Exemplo:

Input: source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]

Output: ["int main()","{ "," ","int a, b, c;","a = b + c;","}"]

C# solução

correspondente/original
public class Solution {
    public IList<string> RemoveComments(string[] source) {
        bool inBlock = false;
        var buffer = new StringBuilder();
        var result = new List<string>();
        
        foreach (var line in source) {
            int i = 0;
            if (!inBlock) buffer.Clear();
            while (i < line.Length) {
                if (!inBlock && i + 1 < line.Length && line[i] == '/' && line[i + 1] == '*') {
                    inBlock = true;
                    i++;
                } else if (inBlock && i + 1 < line.Length && line[i] == '*' && line[i + 1] == '/') {
                    inBlock = false;
                    i++;
                } else if (!inBlock && i + 1 < line.Length && line[i] == '/' && line[i + 1] == '/') {
                    break;
                } else if (!inBlock) {
                    buffer.Append(line[i]);
                }
                i++;
            }
            if (!inBlock && buffer.Length > 0) {
                result.Add(buffer.ToString());
            }
        }
        return result;
    }
}

C++ solução

rascunho automático, revisar antes de enviar
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public vector<string> RemoveComments(vector<string> source) {
        bool inBlock = false;
        var buffer = new StringBuilder();
        var result = new List<string>();
        
        foreach (var line in source) {
            int i = 0;
            if (!inBlock) buffer.Clear();
            while (i < line.size()) {
                if (!inBlock && i + 1 < line.size() && line[i] == '/' && line[i + 1] == '*') {
                    inBlock = true;
                    i++;
                } else if (inBlock && i + 1 < line.size() && line[i] == '*' && line[i + 1] == '/') {
                    inBlock = false;
                    i++;
                } else if (!inBlock && i + 1 < line.size() && line[i] == '/' && line[i + 1] == '/') {
                    break;
                } else if (!inBlock) {
                    buffer.Append(line[i]);
                }
                i++;
            }
            if (!inBlock && buffer.size() > 0) {
                result.push_back(buffer.ToString());
            }
        }
        return result;
    }
}

Java solução

correspondente/original
import java.util.*;

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

JavaScript solução

correspondente/original
var removeComments = function(source) {
    let inBlock = false;
    let buffer = [];
    let result = [];
    
    for (let line of source) {
        let i = 0;
        if (!inBlock) buffer = [];
        while (i < line.length) {
            if (!inBlock && i + 1 < line.length && line[i] === '/' && line[i + 1] === '*') {
                inBlock = true;
                i += 1;
            } else if (inBlock && i + 1 < line.length && line[i] === '*' && line[i + 1] === '/') {
                inBlock = false;
                i += 1;
            } else if (!inBlock && i + 1 < line.length && line[i] === '/' && line[i + 1] === '/') {
                break;
            } else if (!inBlock) {
                buffer.push(line[i]);
            }
            i += 1;
        }
        if (buffer.length && !inBlock) {
            result.push(buffer.join(''));
        }
    }
    return result;
};

Python solução

correspondente/original
def removeComments(source):
    inBlock = False
    buffer = []
    result = []
    for line in source:
        i = 0
        if not inBlock:
            buffer = []
        while i < len(line):
            if not inBlock and i + 1 < len(line) and line[i:i+2] == "/*":
                inBlock = True
                i += 1
            elif inBlock and i + 1 < len(line) and line[i:i+2] == "*/":
                inBlock = False
                i += 1
            elif not inBlock and i + 1 < len(line) and line[i:i+2] == "//":
                break
            elif not inBlock:
                buffer.append(line[i])
            i += 1
        if buffer and not inBlock:
            result.append("".join(buffer))
    return result

Go solução

correspondente/original
package main

import (
    "strings"
)

func removeComments(source []string) []string {
    inBlock := false
    var buffer strings.Builder
    var result []string
    
    for _, line := range source {
        i := 0
        if !inBlock {
            buffer.Reset()
        }
        for i < len(line) {
            if !inBlock && i + 1 < len(line) && line[i:i+2] == "/*" {
                inBlock = true
                i++
            } else if inBlock && i + 1 < len(line) && line[i:i+2] == "*/" {
                inBlock = false
                i++
            } else if !inBlock && i + 1 < len(line) && line[i:i+2] == "//" {
                break
            } else if !inBlock {
                buffer.WriteByte(line[i])
            }
            i++
        }
        if !inBlock && buffer.Len() > 0 {
            result = append(result, buffer.String())
        }
    }
    return result
}

Algorithm

Создайте строку buffer для хранения текущей строки кода без комментариев и флаг inBlock для отслеживания, находимся ли мы внутри блочного комментария.

Пройдите по каждой строке source и по каждому символу в этой строке, обрабатывая комментарии: Если встречен блочный комментарий /*, установите флаг inBlock и пропустите символы до */. Если встречен строчный комментарий //, прекратите обработку текущей строки. Если не находимся внутри комментария, добавьте символ в buffer.

После обработки всех строк добавьте непустые строки из buffer в результат.

😎

Vacancies for this task

vagas ativas with overlapping task tags are mostradas.

Todas as vagas
Ainda não há vagas ativas.