SMU 算法题 情书的编码

题目:

截获了Bobwu的检讨以后,Linkinpaoger突然想到可以用自己的加密方式来加密情书。Linkinpaoger写了一封给Anonymous的情书并加密,然后发现密文中出现了很多类似ABBCCC的字符串。经过思索,Linkinpaoger决定按以下规则压缩密文:

1.任何包含k个相同字符的子串被替换为kX,X表示该子串中的唯一字符。

2.若某个这样的子串长度为1,那么省略‘1’。

按以上规则,ABBCCC将被压缩为A2B3C。现在请你帮Linkinpaoger压缩密文。

输入:

输入的第一行为一个正整数N,表示共有N组测试数据,接下来的每一行表示一组密文,密文仅由‘A'-’Z'组成。

1≤N≤100,每组密文的长度不超过10000个字符长度。

输出:

对于每组输入数据,输出一行压缩后的密文。

样例输入:

2
ABC
ABBCCC

样例输出:

ABC
A2B3C

绞尽脑汁写了个很渣的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int i, n, counter = 1, j;
    char str[100][10000], *p, *q, *t, num[1000], temp;

    scanf("%d", &n);
    getchar();

    for (i = 0; i < n; i++) {
        j = 0;
        while ((str[i][j++] = getchar()) != '\n')
        ;
        str[i][j - 1] = '\0';
        p = str[i];
        q = str[i];
        while (*p)
        {
            if (*p == *(p + 1)) {
                counter++;    // 计数:有多少个重复字母
            }
            else
            {
                temp = *p;    // 临时变量储存现在的字母

                if (counter > 1) {
                    sprintf(num, "%d", counter);    // 规定格式:存在字符数组里
                    t = num;
                    while (*t) {
                        *(q++) = *(t++);
                    }
                }
                *(q++) = temp;
                counter = 1;
            }
            p++;
        }
        *(q++) = '\0';
    }

    for (i = 0; i < n; i++)
        puts(str[i]);

    return 0;
}

当时没写完这篇文章 也算了吧 仅供参考。

如果您觉得文章不错,可以通过赞助支持我

标签: 源码, 知识, 代码段, 语法, 题目, 算法

添加新评论