1078 字符串压缩与解压 逻辑 + String

题解

逻辑
我其实不怎么分得清什么是逻辑题,只是感觉比较难想的就是
我看柳神把这个题归为逻辑题,我。。。嗯就是吧,我做这个的时候比较轻松
其实这两天做题都挺轻松,可能是做的量上来了,感觉也跟着来了,今天做的题,都是一下过,没有改bug
题解:
对于字符串的遍历,我喜欢while(!s.empty())
就是一直遍历到空,每次都删除第一个,每次都看第一个,这样就不需要考虑下标的变化,我喜欢这样
1.压缩:每次都字符有几个,如果是1个就直接输出,2个以上就先输出个数再输出字符
2.解压:判断当前字符是否为数字,如果是,就一直往下走,直到把所有的数字遍历完(我一开始没想到,原来不只是一位数),然后获取到数字,while循环输出,如果没有获取到数字,就直接输出

Code

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
    char N;
    cin >> N;
    string s;
    getchar();
    getline(cin, s);
    if (N == 'C')
    {
        char c;
        // 一直到s为空
        while (!s.empty())
        {
            int cnt = 0;
            c = s.front();
            // 计算个数
            while (s.front() == c && !s.empty())
            {
                s.erase(0, 1);
                cnt++;
            }
            // 一个就直接输出
            if (cnt == 1)
                cout << c;
            else
                cout << cnt << c;
        }
    }
    else
    {
        int t = 0;
        // 遍历
        while (!s.empty())
        {
            // 判断数字是多少
            if (isdigit(s.front()))
            {
                string st;
                while (isdigit(s.front()) && !s.empty())
                {
                    st.push_back(s.front());
                    s.erase(0, 1);
                }
                t = stoi(st);
                while (t--)
                {
                    cout << s[0];
                }
                t = 0;
                s.erase(0, 1);
            }
            else
            {
                // 一个的就直接输出
                cout << s.front();
                s.erase(0, 1);
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值