压缩算法 【腾讯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?
分析:
題目給出的為一串壓縮過的字符串,壓縮的規律為:將連續的重復字符字串壓縮為一次,并記下出現的次數?,F在要我們根據這個規律逆推出原字符串。這里我用了遞歸的方式來解這道題。
代碼如下:
#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;elsesum = 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;elseprintf("%c",s[i]);}return 0;}?
總結
以上是生活随笔為你收集整理的压缩算法 【腾讯2020校园招聘-后台综合-第一次笔试 】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决SurfaceView预览Camer
- 下一篇: LeetCode | Climbing