1084 外观数列 (20 分)

1084

找了半天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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值