字符串识别与过滤

来源:互联网 发布:jquery ui.min.js 1.8 编辑:程序博客网 时间:2024/06/06 09:17

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

解法一:

#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。仍然考虑非法输入问题。





0 0
原创粉丝点击