找了半天bug的错误题解
这题呢,本来有一个自己的思路,大致跟下面代码思路差不多。先用cur标记当前字符,然后遍历之后的字符,如果相等,则计数器++,否则就输出cur与计数器的值。但是代码怎么改也改不对。于是去看了柳神的题解。
char cur=s[0];
for(int i=1; i<s.length(); i++)
{
if(s[i]==cur) cnt++;
else{
if(cnt>=2) cout<<cnt;
cout<<cur;
cur=s[i];
cnt=1;
}
}
if(cnt>=2) cout<<cnt;
cout<<cur;
抄出bug的柳神题解
柳神分析:用string s接收所需变幻的数字,每次遍历s,从当前位置i开始,看后面有多少个与s[i]相同,设j处开始不相同,那么临时字符串t =t + s[i] + to_string(j – i); 然后再将t赋值给s,cnt只要没达到n次就继续加油循环下一次,最后输出s的值~
柳神的思路非常非常简洁!非常巧妙!她竟然想到了用下标之差,真的太厉害了!
然后自己敲了一遍,出现的结果竟然是:
10000102031000200030100001022000010230001000010203100020210001020310002030000102100001020310002000301000010220002010000102100020
而正确答案是:
1123123111
差异非常大。就这几行短短的代码,找了半天才发现bug所在,问题就出在第3个for循环上!!!它下面的不是循环体!!!而是单独一条语句Orz
意思是:当出现不相同的字符之后,再去执行将当前字符与差值转换成的字符串添加到val里去!
学到了学到了,这种用法自己平时也是用的少吧
#include <iostream>
using namespace std;
int main()
{
string ans,val;
int n,j;
cin>>ans>>n;
for(int v=0;v<n-1;v++){
val="";
for(int i=0;i<ans.length();i=j){
for(j=i;j<ans.length()&&ans[j]==ans[i];j++){
val+=ans[i]+to_string(j-i);
}
}
ans=val;
}
cout<<ans;
return 0;
}
正确题解
#include <bits/stdc++.h>
using namespace std;
int main()
{
string ans;
int n,j;
cin>>ans>>n;
for(int v=1;v<n;v++){
string val;
for(int i=0;i<ans.length();i=j){
for(j=i;j<ans.length()&&ans[j]==ans[i];j++);
val+=ans[i]+to_string(j-i);
}
ans=val;
}
cout<<ans;
return 0;
}