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