Сложность: medium
Дана программа на C++, удалите из нее комментарии. Исходный текст программы представляет собой массив строк source, где source[i] - это i-я строка исходного кода. Это результат разбиения исходной строки исходного кода символом новой строки '\n'. В C++ существует два типа комментариев: строчные и блочные. Строка "//" обозначает строчный комментарий, который означает, что он и остальные символы справа от него в той же строке должны игнорироваться. Строка "/*" обозначает блочный комментарий, который означает, что все символы до следующего (не перекрывающегося) вхождения "*/" должны игнорироваться. (Здесь вхождения происходят в порядке чтения: строка за строкой слева направо.) Чтобы было понятно, строка "/*/" еще не завершает блочный комментарий, так как окончание будет перекрывать начало. Первый эффективный комментарий имеет приоритет над остальными.
Например, если строка "//" встречается в блочном комментарии, она игнорируется. Аналогично, если строка "/*" встречается в строчном или блочном комментарии, она также игнорируется. Если после удаления комментариев определенная строка кода оказывается пустой, вы не должны выводить эту строку: каждая строка в списке ответов будет непустой.
Пример:
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;","}"]👨💻 Алгоритм:
1⃣Создайте строку buffer для хранения текущей строки кода без комментариев и флаг inBlock для отслеживания, находимся ли мы внутри блочного комментария.
2⃣Пройдите по каждой строке source и по каждому символу в этой строке, обрабатывая комментарии: Если встречен блочный комментарий /*, установите флаг inBlock и пропустите символы до */. Если встречен строчный комментарий //, прекратите обработку текущей строки. Если не находимся внутри комментария, добавьте символ в buffer.
3⃣После обработки всех строк добавьте непустые строки из buffer в результат.
😎 Решение:
class Solution {
func removeComments(_ source: [String]) -> [String] {
var inBlock = false
var buffer = [Character]()
var result = [String]()
for line in source {
var i = 0
if !inBlock { buffer = [] }
let chars = Array(line)
while i < chars.count {
if !inBlock && i + 1 < chars.count && chars[i] == "/" && chars[i + 1] == "*" {
inBlock = true
i += 1
} else if inBlock && i + 1 < chars.count && chars[i] == "*" && chars[i + 1] == "/" {
inBlock = false
i += 1
} else if !inBlock && i + 1 < chars.count && chars[i] == "/" && chars[i + 1] == "/" {
break
} else if !inBlock {
buffer.append(chars[i])
}
i += 1
}
if !buffer.isEmpty && !inBlock {
result.append(String(buffer))
}
}
return result
}
}Ставь 👍 и забирай 📚 Базу знаний