722. Remove Comments
Дана программа на C++, удалите из нее комментарии. Исходный текст программы представляет собой arreglo строк source, где source[i] - это i-я cadena исходного кода. Это результат разбиения исходной строки исходного кода символом новой строки '\n'. В C++ существует два типа комментариев: строчные и блочные. cadena "//" обозначает строчный комментарий, который означает, что он и остальные символы справа от него в той же строке должны игнорироваться. cadena "/*" обозначает блочный комментарий, который означает, что все символы до следующего (не перекрывающегося) вхождения "*/" должны игнорироваться. (Здесь вхождения происходят в порядке чтения: cadena за строкой слева направо.) Чтобы было понятно, cadena "/*/" еще не завершает блочный комментарий, так как окончание будет перекрывать начало. Первый эффективный комментарий имеет приоритет над остальными.
НаEjemplo, если cadena "//" встречается в блочном комментарии, она игнорируется. Аналогично, если cadena "/*" встречается в строчном или блочном комментарии, она также игнорируется. Если после удаления комментариев определенная cadena кода оказывается пустой, вы не должны выводить эту строку: каждая cadena в списке ответов будет непустой.
Ejemplo:
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# solución
coincidente/originalpublic 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++ solución
borrador 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 solución
coincidente/originalimport 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 solución
coincidente/originalvar 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 solución
coincidente/originaldef 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 solución
coincidente/originalpackage 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 в результат.
😎
Vacantes para esta tarea
Se muestran vacantes activas con etiquetas coincidentes.