压缩数据

xiaoxiao2021-02-27  406

给定一串数据,按照规律进行压缩,比如: 压缩前: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; }

运行结果:

转载请注明原文地址: https://www.6miu.com/read-2192.html

最新回复(0)