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;
}

运行结果

相关推荐
信奥卷王1 小时前
[GESP202506 六级] 最大因数(含视频)
数据结构·算法
局部有解1 小时前
Leetcode - 42 接雨水(一维)
数据结构·c++·算法·leetcode
专注API从业者1 小时前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
SuperByteMaster2 小时前
while(1){;} 加分号
c语言
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
Tisfy2 小时前
LeetCode 3723.数位平方和的最大值:构造
数学·算法·leetcode·字符串·题解
星恒随风3 小时前
Linux进程信号(一):从Ctrl+C到kill、raise、alarm,深入理解信号的概念与产生原理
linux·c语言·笔记·学习·状态模式
学逆向的3 小时前
C 浮点数e(科学计数法)
c语言·开发语言·网络安全
知识分享小能手3 小时前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法