722. Remove Comments

LeetCode medium original: C# #array #csharp #leetcode #medium #string
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

Дана программа на 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;","}"]

C# 해법

매칭됨/원본
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++ 해법

자동 초안, 제출 전 검토
#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 해법

매칭됨/원본
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 해법

매칭됨/원본
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 해법

매칭됨/원본
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 해법

매칭됨/원본
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

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.