欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【蓝桥杯】[算法提高VIP] 去注释

程序员文章站 2022-07-13 23:26:35
...

题目

原题链接

【蓝桥杯】[算法提高VIP] 去注释

分析

这是一道非常不错的字符串的练习题。虽然说不涉及什么算法,但如果需要一点点小思维,否则可能会觉得很乱无从下手。

边读入边输出,不好判断,难度比较大。所以可以所有字符一次性读入一个足够大的字符数组中。然后再遍历进行处理,由于有了下标,处理起来方便很多。

设置开关变量flag,是解决本题一个很关键的思想。flag=1:表示不是注释,可以输出,相当于水龙头处于打开的状态;flag=0:表示是注释,不用输出,相当于水龙头处于关闭的状态。

什么时候改变开关变量flag的状态呢?首先很容易理解,要开水龙头,那水龙头此时肯定是关着的,你才能开。同理,要关水龙头,那水龙头此时肯定是开着的,你才能关。注释 "/*...*/" 有很明显的开始和结束的标志, 但注释 "//" 却无特殊的结束标志,故另外需要添加一个特殊标记。详情见代码,代码中已给出注释,代码还算简洁。

代码

#include<iostream>
#include<cstdio>
using namespace std;

char s[10005];

int main()
{
	char c;
	int k=0;
	while((c=getchar())!=EOF)
		s[k++]=c;
	s[k]='\0'; //这个不要忘了 
	
	int flag=1; //开关变量。flag=1:不是注释,可以输出。相当于水龙头处于打开状态 
	int mark=0; //特殊标记。由于//这种注释没有特殊的结尾标识,故需要特殊标记 
	for(int i=0;s[i]!='\0';i++)
	{
		//重开水龙头
		if(!flag && s[i-1]=='/' && s[i-2]=='*') //水龙头一开始处于关的状态才能开,故须!flag。且碰到注释的结束标志"*/"
			flag=1;
		if(!flag && mark && s[i]=='\n')//"//"这种注释结束的位置有个换行符,但"/**/"里面同样也可以有换行符,故需要特殊标志 
		{
			flag=1;
			mark=0; //重置特殊标记 
		}
			
		//关水龙头 
		if(flag && s[i]=='/' && (s[i+1]=='*'||s[i+1]=='/' )) 
		{ //水龙头是处于开的状态才能关,故须flag=1,且碰到注释的开始标志"/*"或者"//"
			flag=0;
			if(s[i+1]=='/') //如果是"//"这种注释,就添加特殊注释 
				mark=1;  
		}
		
		if(flag)
			putchar(s[i]);
	}
	
	return 0;
}