压缩算法 【腾讯2020校园招聘-后台&综合-第一次笔试 】

简介: 压缩算法 【腾讯2020校园招聘-后台&综合-第一次笔试 】

题目:小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?

输入描述:

输入第一行包含一个字符串s,代表压缩后的字符串。

S的长度<=1000;

S仅包含大写字母、[、]、|;

解压后的字符串长度不超过100000;

压缩递归层数不超过10层;

 

输出描述:

输出一个字符串,代表解压后的字符串。

 

输入例子1:

HG[3|B[2|CA]]F

 

输出例子1:

HGBCACABCACABCACAF

 

例子说明1:

HG[3|B[2|CA]]F−>HG[3|BCACA]F−>HGBCACABCACABCACAF

 

分析:

题目给出的为一串压缩过的字符串,压缩的规律为:将连续的重复字符字串压缩为一次,并记下出现的次数。现在要我们根据这个规律逆推出原字符串。这里我用了递归的方式来解这道题。

代码如下:

#include<stdio.h>
#include<string.h>
char s[1005];
//定义一个函数,输出重复的字符串 
int decom(int i)
{
//确定重复次数
    int sum = s[i]-'0';
    while (1){
        i++;
        if(s[i]=='|')
            break;
        else
            sum = sum*10 + s[i]-'0';
    }
//标记重复子串的起始位置
    int flag = i+1;
    int j=0;
    i+=1;
//遍历子串
    for(j;j<sum;){
//有嵌套的话,递归  
        if(s[i] == '[')
            i = decom(i+1);
//结束一次循环
        else if(s[i] == ']'){
            j++;
            i++;
            //printf("sum=%d i=%d j=%d flag=%d\n",sum,i,j,flag);
            if(j<sum){  
                i = flag;
                //printf("循环%d次\n",j);
            }
        }
        else{
            printf("%c",s[i]);
            i++;
        }
    }
    //printf("return%d\n",i);
    return i;
}
int main()
{
    scanf("%s",s);
    int i;
    for (i=0;i<strlen(s);i++)
    {
        if(s[i]=='[')
//这里要注意减一
            i = decom(i+1)-1;
        else if(s[i]==']' || s[i]=='|')
            continue;
        else
            printf("%c",s[i]);
    }
    return 0;
 }
目录
相关文章
|
2月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
2月前
|
算法 测试技术 C++
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
|
3月前
|
算法 测试技术 C#
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
3月前
|
算法
电子好书发您分享《超全算法笔试 模拟题精解合集》
电子好书发您分享《超全算法笔试 模拟题精解合集》
25 3
|
3月前
|
算法
电子好书发您分享《超全算法笔试 模拟题精解合集》
电子好书发您分享《超全算法笔试 模拟题精解合集》
26 2
|
5月前
|
存储 算法 NoSQL
Zstandard (zstd)压缩算法在JAVA上的使用
Zstandard (zstd)压缩算法在JAVA上的使用
269 0
|
1月前
|
存储 人工智能 算法
大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
|
1月前
|
存储 算法
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
|
2月前
|
算法 测试技术 C++
【状态压缩】【动态规划】【C++算法】691贴纸拼词
【状态压缩】【动态规划】【C++算法】691贴纸拼词
|
2月前
|
编解码 算法 前端开发
往年 | 大疆雷达算法校招笔试题目解析
往年 | 大疆雷达算法校招笔试题目解析
33 1