华为笔试题 字符串解压缩
题目描述
将一段压缩后的字符串解压缩,并且排序输出。
解压规则:
每个字符串后面跟着一个数字,表示这个字符串的重复次数。例如,”a5”解压后的结果为”aaaaa”;’abc3’解压后的结果为”abcabcabc”。
排序规则:
1、根据每个字符串的重复次数升序排序,然后输出结果。例如,”a3b2”,输出的结果为”bbaaa”。
2、如果字符重复次数一样,则根据ASCII编码顺序做升序排序,然后输出结果。例如,”b2a2”,输出的结果为”aabb”。
输入描述:
输入的原始字符串仅包含字母与数字
输出描述:
输出的结果字符串仅包含字母
示例1
输入
a11b2bac3bad3abcd2
输出
abcdabcdbbbacbacbacbadbadbadaaaaaaaaaaa
下面直接上代码了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char str[256];
int num;
} strList;
#define ISNUM(a) (a <= '9' && a >= '0')
int cmp(const void *a, const void *b) {
strList *list1, *list2;
list1 = (strList *)a;
list2 = (strList *)b;
printf("list1: %d, list: %d\n", list1->num, list2->num);
if(list1->num != list2->num) {
return list1->num - list2->num;
} else {
return strcmp(list1->str, list2->str);
}
}
`int main(void)
{
char *strOrg = "a1bc14";
char strUnzip[100000] = {0};
int i, j = 0, k = 0;
strList list[256] = {{0}, 0};
int nums = 0;
int size;
for(i = 0; i < strlen(strOrg); i++) {
if(i > 0 && !ISNUM(strOrg[i]) && ISNUM(strOrg[i - 1])) {
list[j].num = nums;
nums = 0;
j++;
k = 0;
}
if(!ISNUM(strOrg[i])) {
list[j].str[k] = strOrg[i];
k++;
} else {
nums = nums * 10 + strOrg[i] - '0';
}
}
if(nums == 0) {
list[j].num = 1;
} else {
list[j].num = nums;
}
qsort(list, j + 1, sizeof(strList), cmp);
i = 0, j = 0, k = 0;
while(list[j].num > 0) {
size = strlen(list[j].str);
strncpy(&strUnzip[i], list[j].str, size);
i += size;
list[j].num--;
if(list[j].num == 0) {
j++;
}
}
printf("%s", strUnzip);
system("pause");
}