1. 程式人生 > >字串內特殊字元處理‘#’‘@’

字串內特殊字元處理‘#’‘@’

//問題描述
/*
輸入一個字串,裡面包含特殊字元‘@’‘#’,對每個字串作如下處理
1. 如果遇到‘@’,則刪除‘@’之前的所有字元(包括‘@’)
2. 如果遇到‘#’,則刪除‘#’之前的一個字元(包括‘#’)

*/

//問題分析:

最直接的辦法,遍歷整個字串,遇到‘@’‘#’再做相應處理,處理可以是直接刪除,但需要注意的是,如果直接刪除,刪除會改變字串大小,遍歷字串則應該注意。或者是將這些字元標記為不可用,但這需要對整個字串重新遍歷一次。

int main()
{

	int T;
	
	cin >> T;
	
	for (int kase = 0; kase < T; kase++)
	{
		string str;
		cin >> str;

		for (int i = 0; i < str.length();)
		{
			if (str[i] == '#')
			{
				if ((i - 1) >= 0)     //要判斷‘#’字元是否為第一個字元
				{
					str.erase(i - 1, 2);
					i = i - 1;

				}
				else
				{
					str.erase(i, 1);
				}
				continue;

			}
			if (str[i] == '@')
			{
				str.erase(0, i+1);
				i = 0;
				continue;
			}

			i++;
		}

		cout << str << endl;

	}

	

	return 0;
}


採用標記字元的方法:

void delSpecialChar(string str)
{
	int len = str.length();
	int * flag = new int[len];
	for (int i = 0; i < len; i++)
	{
		flag[i] = 1;
	}

	for (int i = 0; i < len; i++)
	{
		if (str[i] == '@')
		{
			for (int j = 0; j <= i; j++)
			{
				flag[j] = 0;
			}
		}
		if (str[i] == '#')
		{
			if (i != 0)
			{
				flag[i-1] = 0;
			}
			flag[i] = 0;
		}
	}


	for (int i = 0; i < len; i++)
	{
		if (flag[i])
			cout << str[i];
	}

}