722. 刪除注釋
給一個 C++ 程序,刪除程序中的注釋。這個程序source是一個數組,其中source[i]表示第i行源碼。 這表示每行源碼由\n分隔。
在 C++ 中有兩種注釋風格,行內注釋和塊注釋。
字符串// 表示行注釋,表示//和其右側的其余字符應該被忽略。
字符串/* 表示一個塊注釋,它表示直到*/的下一個(非重疊)出現的所有字符都應該被忽略。(閱讀順序為從左到右)非重疊是指,字符串/*/并沒有結束塊注釋,因為注釋的結尾與開頭相重疊。
第一個有效注釋優先于其他注釋:如果字符串//出現在塊注釋中會被忽略。 同樣,如果字符串/*出現在行或塊注釋中也會被忽略。
如果一行在刪除注釋之后變為空字符串,那么不要輸出該行。即,答案列表中的每個字符串都是非空的。
樣例中沒有控制字符,單引號或雙引號字符。比如,source = “string s = “/* Not a comment. */”;” 不會出現在測試樣例里。(此外,沒有其他內容(如定義或宏)會干擾注釋。)
我們保證每一個塊注釋最終都會被閉合, 所以在行或塊注釋之外的/*總是開始新的注釋。
最后,隱式換行符可以通過塊注釋刪除。 有關詳細信息,請參閱下面的示例。
從源代碼中刪除注釋后,需要以相同的格式返回源代碼。
示例 1:輸入:
source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]示例代碼可以編排成這樣:
/*Test program */
int main()
{ // variable declaration
int a, b, c;
/* This is a testmultiline comment for testing */
a = b + c;
}輸出: ["int main()","{ "," ","int a, b, c;","a = b + c;","}"]編排后:
int main()
{ int a, b, c;
a = b + c;
}解釋:
第 1 行和第 6-9 行的字符串 /* 表示塊注釋。第 4 行的字符串 // 表示行注釋。
示例 2:輸入:
source = ["a/*comment", "line", "more_comment*/b"]
輸出: ["ab"]
解釋: 原始的 source 字符串是 "a/*comment\nline\nmore_comment*/b", 其中我們用粗體顯示了換行符。刪除注釋后,隱含的換行符被刪除,留下字符串 "ab" 用換行符分隔成數組時就是 ["ab"].
注意:
- source的長度范圍為[1, 100].
- source[i]的長度范圍為[0, 80].
- 每個塊注釋都會被閉合。
- 給定的源碼中不會有單引號、雙引號或其他控制字符。
解題思路
- 處理//注釋,只需要把改行后面的字符全部刪除
- 當遇到/*,我們設定一個標記位mutiRowDel=true,只要還沒遇到 */,就不處理任何字符
細節:[“a/comment", “line”, "more_comment/b”] 如果出現這種情況,塊注釋會把換行也刪除掉,所以我們需要把塊注釋起始行和結束行里面的字符結合為一行
代碼
class Solution {public List<String> removeComments(String[] source) {boolean rowDel=false,mutiRowDel=false;List<String> list=new ArrayList<>();for(String s:source){boolean old=mutiRowDel;StringBuilder sb=new StringBuilder();for(int i=0;i<s.length();i++){if(i+1<s.length()&&mutiRowDel&&s.charAt(i)=='*'&&s.charAt(i+1)=='/'){i++;mutiRowDel=false;continue;}if(mutiRowDel) continue;if(i+1<s.length()&&s.charAt(i)=='/'&&s.charAt(i+1)=='*'){i++;mutiRowDel=true;continue;} if(i+1<s.length()&&s.charAt(i)=='/'&&s.charAt(i+1)=='/')break;sb.append(s.charAt(i));}if(sb.length()!=0){if(old){String t=list.remove(list.size()-1);list.add(t+sb.toString());}else list.add(sb.toString()); }}return list;}
}