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;
}
当时没写完这篇文章 也算了吧 仅供参考。
植入部分
如果您觉得文章不错,可以通过赞助支持我。
如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。