日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 722. CPP删除注释(逻辑题)

發布時間:2024/7/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 722. CPP删除注释(逻辑题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

給一個 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]. 每個塊注釋都會被閉合。 給定的源碼中不會有單引號、雙引號或其他控制字符。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-comments
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 注意多行注釋塊前后字符需要拼接在一行
class Solution { public:vector<string> removeComments(vector<string>& source) {bool foundBlock = false;//找到多行注釋塊bool foundlineCom = false;//單行注釋塊int i, j;bool flag = true;string contiStr;//多行注釋塊刪除后,其前后需要拼接,存儲前面部分for(i = 0; i < source.size(); ++i){foundlineCom = false;//每次進入下一行,其為falsefor(j = 0; j < source[i].size(); ++j){if(!foundBlock && !foundlineCom){if(source[i].substr(j,2) == "//")foundlineCom = true;else if(source[i].substr(j,2) == "/*")foundBlock = true; }if(foundlineCom){source[i].erase(j);break;//如果是單行注釋,直接刪除到末尾,跳到下一行}else if(foundBlock)//是多行注釋{if(flag)//先刪除2個字符 /*,避免 /*/ 出錯{source[i].erase(j,2);j--;//后面要++,先--,避免跳過字符flag = false;continue;}if(source[i].substr(j,2) == "*/"){ //找到多行注釋結束標志source[i].erase(j,2);//刪除*/foundBlock = false;//結束source[i] = contiStr+source[i];//拼接多行注釋塊前面的字符j += contiStr.size()-1;//調整 j, 繼續后面處理contiStr = "";flag = true;}else//正常刪除中間字符{source[i].erase(j,1);j--;}}}if(foundBlock)//如果是多行注釋{contiStr += source[i];//前面的字符拼接起來source[i].clear();//移到contiStr了,清空}}for(int i = 0; i < source.size(); i++)if(source[i].empty()){ //刪除空白行source.erase(source.begin()+i);i--;}return source;} };

總結

以上是生活随笔為你收集整理的LeetCode 722. CPP删除注释(逻辑题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。