压缩数据
来源:互联网 发布:淘宝爱奇艺会员没了 编辑:程序博客网 时间: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
- 压缩数据
- 压缩数据
- 过程 数据集压缩
- java GZIP 压缩数据
- servlet压缩数据
- Hive_1. 数据存储 & 压缩
- 数据重删压缩
- Gzip压缩数据解压
- gzip压缩解压缩数据
- python压缩数据
- UnityGZip 压缩数据DLL
- Linux压缩数据
- 亲自尝试压缩数据
- 数据预处理--词语压缩
- 使用压缩流压缩和解压数据
- 为所有dml压缩数据(oltp压缩)
- GzipStream流读写压缩数据!
- Android 压缩Post请求数据
- 《SED 单行脚本快速参考》的 awk 实现
- 正确学习Linux系统的5个建议
- Java设计模式之单例模式
- Python练习—画图软件生成的图像转成txt文件(只有0和1)
- C#学习之Task 的用法2
- 压缩数据
- Makefile经典教程提纲与收藏
- Android反射查询系统属性
- 获取jdk所在系统相关属性
- JavaScript对象篇
- 【Java基础知识】并发
- 解决:安装Android Studio 2.0后无法查看源码
- 同一台机器上安装多个版本的JDK,并自由切换
- 装饰器模式