压缩数据

来源:互联网 发布:淘宝爱奇艺会员没了 编辑:程序博客网 时间:2024/06/04 19:03

给定一串数据,按照规律进行压缩,比如:
压缩前:1,1,1,1,2,2,2,3,8,3,1,1,2,7
压缩后:4,1,3,2,-3,3,8,3,2,1,-2,2,7

参考代码1:

#include <stdio.h>#include <malloc.h>#include <math.h>enum EmState{    emInit    = 0,    emSame    = 1,    emDif     = 2,};int main(){    int arr[] = { 1, 1, 1, 1, 2, 2, 2, 3, 8, 3, 1, 1, 2, 7};    //int arr[] = {1,2,2,3,4,8,9,9,10,10,10,9,10,11,12,13,13,14,14,15};    int nSize = sizeof(arr) / sizeof(arr[0]);    int *pCnt = (int*)malloc((nSize + 1) * sizeof(int));    int i, j, nLen = 0, nTemp = arr[0];    enum EmState lastState = emInit;    pCnt[nLen++] = 0;    for (i = 1; i < nSize; i++)    {        if (arr[i] == nTemp)        {            if (lastState == emDif)                pCnt[nLen++] = -(i - 1);//不想另外用标记,所以如果是不同的直接标记为负数            lastState = emSame;        }        else        {            if (lastState == emSame)            {                if (i - arr[nLen] > 1)                {                    pCnt[nLen++] = i;                    lastState = emInit;                }            }            else                lastState = emDif;        }        nTemp = arr[i];    }    pCnt[nLen++] = lastState == emSame ? i : -i;    for (i = 1; i < nLen; i++)    {        if (i > 1) printf(",");        if (pCnt[i] > 0)        {            printf("%d,%d", abs(pCnt[i]) - abs(pCnt[i - 1]), arr[abs(pCnt[i - 1])]);        }        else        {            printf("%d", abs(pCnt[i - 1]) - abs(pCnt[i]));            for (j = abs(pCnt[i - 1]); j < abs(pCnt[i]); j++)                printf(",%d", arr[j]);        }    }    printf("\n");    free(pCnt);    return 0;}

参考代码2:

#include <stdio.h>enum EmState{    emInit    = 0,    emSame    = 1,    emDif     = 2,};int main(){    int arr[] = { 1, 1, 1, 1, 2, 2, 2, 3, 8, 3, 1, 1, 2, 7};    //int arr[] = {1,2,2,3,4,8,9,9,10,10,10,9,10,11,12,13,13,14,14,15};    int nSize = sizeof(arr) / sizeof(arr[0]);    int i, j, nStartPos = 0, nTemp = arr[0];    enum EmState lastState = emInit;    for (i = 1; i < nSize; i++)    {        if (arr[i] == nTemp)        {            if (lastState == emDif)            {                i--;                if (i > nStartPos)                {                    if (nStartPos > 0) printf(",");                    printf("%d", nStartPos - i);                    for (j = nStartPos; j < i; j++)                        printf(",%d", arr[j]);                }                nStartPos = i;                lastState = emInit;            }            else                lastState = emSame;        }        else        {            if (lastState == emSame)            {                if (i - nStartPos > 1)                {                    if (nStartPos > 0) printf(",");                    printf("%d,%d", i - nStartPos, arr[nStartPos]);                    nStartPos = i;                    lastState = emInit;                }            }            else                lastState = emDif;        }        nTemp = arr[i];    }    if (nStartPos > 0) printf(",");    if (lastState == emSame)        printf("%d,%d", i - nStartPos, arr[i - 1]);    else    {        if (i > nStartPos)        {            printf("%d", nStartPos - i);            for (j = nStartPos; j < i; j++)                printf(",%d", arr[j]);        }    }    printf("\n");    return 0;}

运行结果:
这里写图片描述

3 0
原创粉丝点击