这里提供一种正确做法和一种答案错误的残次品方法,虽然答案错误,但是好多样例自己测试的时候也通过了,有点不知所措。
正确做法:
#include<iostream>
#include<string>
using namespace std;
main()
{
string s;
int i,count=1;
cin>>s;
for(i=1;i<s.size();i++)
{
if(s[i]!=s[i-1])
{
cout<<count<<s[i-1];//输出前一项
count=0;
}
count++;
}
cout << count << s[s.size() - 1];//最后一个特殊判断
}
残次品做法:
首先使用ch记录当前字符,使用num记录当前连续个数,然后从下标1开始遍历,如果当前元素与ch相等,那么个数加一,反之不相等则先输出num和ch然后再更新ch和num的值,循环结束后还是需要输出最后一组的。
#include<iostream>
#include<cstring>
#include<climits>
using namespace std;
char a[1010];
int main()
{
fgets(a,1010,stdin);
int len=strlen(a);
int num=1; //当前个数
char ch=a[0]; //当前字符
for(int i=1;i<len;i++)
{
if(a[i]==ch)
num++;
else
{
cout<<num<<ch;
ch=a[i];
num=1;
}
}
cout<<num<<ch;
return 0;
}
所以残次品方法到底哪里错了呢??
还是fgets的错误!!记住fgets的最后一个字符是空白符啊!!
更改残次品后的正确做法:
#include<iostream>
#include<cstring>
#include<climits>
using namespace std;
char a[1010];
int main()
{
fgets(a,1010,stdin);
int len=strlen(a);
int num; //当前个数
char ch; //当前字符
if(len>1)
{
num=1;
ch=a[0];
}
for(int i=1;i<len-1;i++) //去掉最后一个空白字符
{
if(a[i]==ch)
num++;
else
{
cout<<num<<ch;
ch=a[i];
num=1;
}
}
cout<<num<<ch;
return 0;
}