seo兼職論壇手機優(yōu)化大師官網(wǎng)
題目
?
示例
?
思路
題意 -> 給定一段代碼,將代碼中的注釋刪除并返回。
由于注釋只有兩種類型:
- 字符串// 表示行注釋,表示//和其右側(cè)的其余字符應該被忽略。
- 字符串/* 表示一個塊注釋,它表示直到下一個(非重疊)出現(xiàn)的*/之間的所有字符都應該被忽略。(閱讀順序為從左到右)非重疊是指,字符串/*/并沒有結(jié)束塊注釋,因為注釋的結(jié)尾與開頭相重疊。
那么可以直接模擬,逐行分析源代碼。每個字符有兩種情況,要么在一個注釋內(nèi)要么不在。因此我們用 in_block 變量來標記狀態(tài),該變量為 true 表示在注釋內(nèi),反之則不在。
假設此刻不在注釋塊內(nèi):
- 遇到 ‘/*’,則將狀態(tài)改為在注釋塊內(nèi),繼續(xù)遍歷后面第三個字符。
- 遇到 ‘//’,則直接忽略該行后面的部分。
- 遇到其他字符,將該字符記錄到 new_line 中。 假設此刻在注釋塊內(nèi),遇到 ‘*/’,則將狀態(tài)改為不在注釋塊內(nèi),繼續(xù)遍歷后面第三個字符。
我們用 new_line 記錄新的一行,當遍歷到每行的末尾時,如果不在注釋塊內(nèi)并且 new_line 不為空,就把它放入答案中。
代碼注釋超級詳細
代碼
/*** Note: The returned array must be malloced, assume caller calls free().*/
#define MAX_LINE_LEN 80
char ** removeComments(char ** source, int sourceSize, int* returnSize) {char **res = (char **)calloc(sourceSize, sizeof(char *));//保存有效值char new_line[sourceSize * 100 + 1];//臨時數(shù)組int pos = 0, new_line_pos = 0;bool in_block = false;for (int j = 0; j < sourceSize; j++) {//遍歷代碼char *line = source[j];//取當前字符串int line_size = strlen(line);for (int i = 0; i < line_size; i++) {//枚舉每一個字符if (in_block) {//判斷注釋結(jié)束位置if (i + 1 < line_size && line[i] == '*' && line[i + 1] == '/') {in_block = false;i++;}} else {//判斷注釋開始位置if (i + 1 < line_size && line[i] == '/' && line[i + 1] == '*') { in_block = true;i++;} else if (i + 1 < line_size && line[i] == '/' && line[i + 1] == '/') {//行注釋,直接跳過當前字符串break;} else {//有效代碼,記錄new_line[new_line_pos++] = line[i];}}}//存儲有效字符串if (!in_block && new_line_pos > 0) {new_line[new_line_pos] = '\0';res[pos] = (char *)calloc(new_line_pos + 1, sizeof(char));strcpy(res[pos], new_line);pos++;new_line_pos = 0;}*returnSize = pos;}return res;
}作者:小迅
鏈接:https://leetcode.cn/problems/remove-comments/solutions/2370701/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-2ovj/
來源:力扣(LeetCode)
著作權歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權,非商業(yè)轉(zhuǎn)載請注明出處。