字符串识别与过滤

首先这道题目,看到测试用例之后,就知道,第一点要考察逗号作为分隔符,第二点,要读题意是连续重复的,我第一遍读题的时候,就没有看到连续的,以为重复的只需要输出一个来。那么很自然第二点就是考察,如果将连续重复的只输出一个。接下来,提供自己的两种解法。

解法一:

#include<string>
#include<iostream>
using namespace std;
int main()
{
	int len1,len2;
	char c='\0';
	string str;
	int i;
	cin>>len1;
	getchar();
	getline(cin,str);
	len2=str.size();
	if(len1!=len2)
	{
		return -1;
	}

	for(i=0;i<len1-1;i++){
		if(str[i]!=str[i+1]){
			cout<<str[i];
		}
	}
	cout<<str[i]<<endl;
	return 0;


}
解法一,

1 首先逗号分隔符问题,我首先想到的当时是解法二中的方法,但是由于当时测试的时候,没有注意将逗号,输入成为了中文逗号,导致自己以为法二不正确,于是用解法1中的getchar函数将输入的逗号吃掉,首先cin将字符串的长度输入,然后getchar把逗号吃点,然后getline就是正常的字符串了。具体可以通过调试看一看,如果不吃掉逗号,将getline的长度输出,字符串的内容输出。getline是带着逗号+字符串的。

2 重复连续的只输出一次,这里尤其要注意,数组下标越界的情况,因为有一个i+1,所以当i=len-1时,就会越界,所以最后要把len-1单独输出。

这里的思想就是比如输入6,aabbcc。那么输出是abc。那就是第一个如果和下一个一样就不输出,知道和下一个不一样输出,也就是每次输出的都是连续重复字符的最后一个,该方法的缺点是,尤其要注意数组下标越界问题。

3 考虑非法输入,也就是输入的字符串长度与前面输入的长度不同时。

解法二:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str,str1;
	char c='\0';
	int len1,len2,i;
	cin>>len1;
	getline(cin,str);
	str1=str.substr(str.find(',')+1,str.size());
	len2=str1.size();
	if(len1!=len2)
	{
		return -1;
	}
	for(i=0;i<len1;i++)
	{
		if(c!=str1[i])
		{
			cout<<str1[i];
			c=str1[i];
		}
	}
	cout<<endl;
	system("pause");
	return 0;
	
}

解法二:

1,逗号问题,首先想到getline得到的字符串str含有一个逗号,那么我们用string类中的substr和find函数将真正的字符串分割出来,这里要注意下标问题,应该找到的逗号的坐标加1开始,最为起始坐标。

2,连续重复只输出一个的问题,考虑到法1中需要考虑字符串越界的问题,我们考虑将连续重复字符的第一个输出每次,剩余的每次遇到一样的不输出,直到遇到不一样的。

举例:6,aabbcc 输出abc。首先设置一个中间字符变量,初始化为‘\0'这样,第一个a与之不同输出,然后再将a的值赋给中间字符变量,与后面一个字符去比较看是否一样,后面一个也是a,一样不输出,然后再将这个a赋值给中间变量,再看下一个是b与他不一样输出。

3。仍然考虑非法输入问题。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值