C语言/数据结构字符串题解:解压缩“字符+次数“格式——多位数字处理与字符串还原

问题描述

小明在整理历史文献时发现了一种古老的压缩字符串,其规则如下:将连续重复的字符用"字符+出现次数"的形式表示。例如,"aaabb"会被压缩成"a3b2"。现在小明需要编写一个解压缩程序,将这种格式的字符串恢复成原始形式。

要求:

  1. 设计一个算法处理输入字符串,输出解压后的完整字符串
  2. 保证输入字符串格式正确,且解压后的字符串长度不超过1000个字符
  3. 注意处理多位数字的情况,如"a12"表示12个连续的'a'

测试样例

样例1:

输入:"a3b2c1" 输出:"aaabbc" 解释:a出现3次(即"aaa"),b出现2次(即"bb"),c出现1次(即"c"),所以解压后为"aaabbc"

样例2:

输入:"x1y5z2" 输出:"xyyyyyzz" 解释:x出现1次(即"x"),y出现5次(即"yyyyy"),z出现2次(即"zz"),所以解压后为"xyyyyyzz"

样例3:

输入:"w2e10f3" 输出:"wweeeeeeeeeefff" 解释:w出现2次(即"ww"),e出现10次(即"eeeeeeeeee"),f出现3次(即"fff"),所以解压后为"wweeeeeeeeeefff"。注意这里e10表示10个e,展示了多位数字的处理。

约束条件

  • 输入字符串长度在1到100之间
  • 字符均为小写英文字母(a-z)
  • 出现次数为1到1000的正整数
  • 解压后的字符串长度不超过1000个字符
  • 输入格式保证正确,总是"字符+数字"交替出现

程序代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

char* decompress(char* s) {

int n = strlen(s);

char* result = (char*)malloc(1001 * sizeof(char)); // 最大1000字符

int idx = 0;

int i = 0;

while (i < n) {

// 读取字符

char ch = si++;

// 读取数字(可能多位)

int count = 0;

while (i < n && si >= '0' && si <= '9') {

count = count * 10 + (si - '0');

i++;

}

// 重复字符 count 次

for (int j = 0; j < count; j++) {

resultidx++ = ch;

}

}

resultidx = '\0';

return result;

}

int main() {

char* r1 = decompress("a3b2c1");

char* r2 = decompress("x1y5z2");

char* r3 = decompress("w2e10f3");

printf("%s\n", r1); // aaabbc

printf("%s\n", r2); // xyyyyyzz

printf("%s\n", r3); // wweeeeeeeeeefff

free(r1);

free(r2);

free(r3);

return 0;

}

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* decompress(char* s) {
    int n = strlen(s);
    char* result = (char*)malloc(1001 * sizeof(char));  // 最大1000字符
    int idx = 0;
    
    int i = 0;
    while (i < n) {
        // 读取字符
        char ch = s[i++];
        
        // 读取数字(可能多位)
        int count = 0;
        while (i < n && s[i] >= '0' && s[i] <= '9') {
            count = count * 10 + (s[i] - '0');
            i++;
        }
        
        // 重复字符 count 次
        for (int j = 0; j < count; j++) {
            result[idx++] = ch;
        }
    }
    
    result[idx] = '\0';
    return result;
}

int main() {
    char* r1 = decompress("a3b2c1");
    char* r2 = decompress("x1y5z2");
    char* r3 = decompress("w2e10f3");
    
    printf("%s\n", r1);  // aaabbc
    printf("%s\n", r2);  // xyyyyyzz
    printf("%s\n", r3);  // wweeeeeeeeeefff
    
    free(r1);
    free(r2);
    free(r3);
    
    return 0;
}

运行结果

相关推荐
蹊黎17 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
夜不会漫长19 小时前
C++:红黑树
数据结构·算法
爱聊灵光的维C19 小时前
从看见世界到重构认知:在视觉与硬件的交汇处,寻找我们这代人的北极星
c语言·物联网·计算机视觉·重构·硬件工程·射频工程
AI+程序员在路上19 小时前
RV1126B 上支持的模型及全流程应用--从CNN及语音到 LLMVLM 与跨平台选型
linux·c语言·人工智能
揽星河..20 小时前
【C语言】扫雷游戏
c语言·算法·游戏
冻柠檬飞冰走茶21 小时前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c1 天前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶1 天前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
Lxx_Zw1 天前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·stm32·单片机·嵌入式硬件
PaperAccept1 天前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算