每日一题-解码(第十一届蓝桥杯)(简单思维)

每日一题-解码(第十一届蓝桥杯)(简单思维)_第1张图片
这是一道比较水的思维题,我竟然发在题解上了,可见我是多么的菜。

我的初始思路是:
从第2个字符开始遍历,每当遍历到数字时,就先停下来往后遍历字符串,计算出前面的字符出现的长度,我认为字符串出现的次数是可以超过两位数的,也就是可以出现几十次。当遍历到的字符不是数字时停下来,结束数字的遍历,可以计算出出现次数。
但是下次遍历字符时,i就要改变了,变为前面访问的数字后的下下个字符判断,就要设置一个临时变量存最后j的数值,最后赋给i,下一次循环i就自加一。
最后要特判最后一个字符,因为始终是对下一个字符判断是否为数字来决定输出前面字符的次数,如果最后一个是字母,最后就不能输出。

#include
using namespace std;
string s;

int main()
{
    cin>>s;
    for(int i=1;i<s.length();i++)
    {
        int x = s[i]-'0';
        if(x<=9&&x>=0)
        {
            int num = 0,temp;
            for(int j=i;s[j]-'0'<=9&&s[j]-'0'>=0;j++)
            {
            	//计算出现次数
                num = num*10 + s[j]-'0';
                //下标为j的是字母时,结束循环了,temp存的是最后一个数字的下标
                temp = j;
            }
            
            for(int j=1;j<=num;j++) cout<<s[i-1];
            //temp+1是数字后下一个字符的下标
            i = temp+1;
        }
        else cout<<s[i-1];
    }//最后i自加一
    if(s[s.length()-1]-'0'>9 || s[s.length()-1]-'0'<0) cout<<s[s.length()-1];
    
    return 0;
}

第二种思路:大同小异,看完题解想到的,只能证明我菜。

从第一个字符开始遍历,如果是字母就输出,不是则往后进行数字的遍历,最后temp记录的则是最后一个数字的下标,然后i自加一,就是数字后的字符。
注意:当后面有数字时,输出字符要少一次,因为前面已经输出了一次。

#include
using namespace std;
string s;

int main()
{
    cin>>s;
    for(int i=0;i<s.length();i++)
    {
        int x = s[i]-'0';
        if(x<=9&&x>=0)
        {
            int num = 0,temp;
            for(int j=i;s[j]-'0'<=9&&s[j]-'0'>=0;j++)
            {
                num = num*10 + s[j]-'0';
                temp = j;
            }
            // cout<
            for(int j=1;j<num;j++) cout<<s[i-1];
            i = temp;
        }
        else cout<<s[i];
    }
    return 0;
}

你可能感兴趣的:(每日一题,字符串,思维)