算法题-解码

e1b29351f9aa46979c2c8dd983102b76.png

#include <bits/stdc++.h> 
using namespace std;

int main(void) {
    char s[101]; // 声明一个字符数组 s,用于存储输入的字符串,最大长度为 100(加上结束符 '\0')
    cin >> s; // 从标准输入读取字符串 s
    int length = 0; // 初始化长度变量
    length = strlen(s); // 计算字符串 s 的长度

    // 遍历字符串 s 中的每个字符
    for (int i = 0; i < length; i++) {
        // 检查当前字符的下一个字符是否是 '2' 到 '9' 的数字,表示重复次数
        if (s[i + 1] > '1' && s[i + 1] <= '9') {
            // 如果是,输出当前字符 s[i] 重复 s[i+1] 次
            for (char j = '1'; j <= s[i + 1]; j++) {
                cout << s[i]; // 输出当前字符
            }
            i++; // 跳过下一个字符,因为已经处理过重复次数
        } else {
            cout << s[i]; // 如果下一个字符不是数字,直接输出当前字符
        }
    }
}

解题思路

  1. 理解输入格式

    • 输入是一个经过压缩的字符串,其中某些字符后面可能跟着一个数字,表示该字符需要重复的次数。例如,H3 表示字符 H 重复 3 次,即 HHH
  2. 遍历字符串

    • 我们需要遍历整个输入字符串,逐个检查每个字符。
    • 当遇到一个字符时,需要判断它后面的下一个字符是否是一个数字(从 '2' 到 '9')。
  3. 处理字符和数字

    • 如果当前字符后面有数字,那么我们要将当前字符输出指定的次数,次数由这个数字决定。
    • 如果没有数字,直接输出当前字符。
  4. 注意边界条件

    • 在遍历字符串时,注意不要越界。特别是在访问 s[i + 1] 时,要确保 i + 1 不超过字符串的长度。
  5. 输出结果

    • 在完成字符串遍历后,我们会得到还原后的完整字符串。

具体步骤

  • 初始化:创建一个字符数组来存储输入字符串,并计算它的长度。

  • 循环遍历

    • 从第一个字符开始,依次检查每个字符。
    • 使用条件判断 if (s[i + 1] > '1' && s[i + 1] <= '9') 来确认下一个字符是否代表重复次数。
    • 如果是,则根据数字决定重复的次数,并在内部循环中输出该字符。
    • 如果不是,直接输出当前字符并继续。
  • 优化与注意

    • 确保处理数字时转换为整数(s[i + 1] - '0'),以便于控制内部循环的次数。
    • 使用 i++ 跳过当前的数值字符,以避免重复处理。

实际例子

考虑输入 H3el5o2 的处理步骤:

  1. 读取字符 H,看到 3,输出 HHH
  2. 读取字符 e,没有数字,直接输出 e
  3. 读取字符 l,看到 5,输出 lllll
  4. 读取字符 o,看到 2,输出 oo
  5. 完成遍历,最终输出结果为 HHHellllloo

复杂度分析

  • 时间复杂度:O(n),其中 n 是输入字符串的长度,因为我们只需遍历字符串一次。
  • 空间复杂度:O(1),不使用额外的数据结构,只是简单的字符数组和一些变量。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值