64,701
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
#include <sal.h>
#include <crtdbg.h>
#include <string.h>
#include <malloc.h>
//caller should be responsible for release return memory by free function.
char* simple_compress(__in_z const char* source)
{
_ASSERTE(source != NULL);
int len = strlen(source);
//allocate enough memory for any conditions.
char* result = (char*)malloc(2*len+1);
if(result == NULL)
return NULL;
//initilize
*result = '\0';
char* buffer = result;
char head = *source;
int count = 1;
for(int i=1;i<=len;++i)
{
if(head != *(source+i))
{
int writtenCount = sprintf(buffer, "%c%d", head, count);
buffer += writtenCount;
head = *(source+i);
count = 1;
}
else
{
++count;
}
if(*source == '\0')
break;
}
return result;
}
void test(const char* source)
{
printf("%s ==> ", source);
char* result = simple_compress(source);
printf("%s\n", result);
free(result);
}
int _tmain(int argc, _TCHAR* argv[])
{
test("");
test("A");
test("AA");
test("AABB");
return 0;
}
#include <vector>
#include <stdio.h>
//算法所使用的数据结构,
// m_cCharactor表示当前的字符
// m_iRptTime表示字符重复的次数
class Node
{
public:
Node(char c, int i)
: m_cCharactor(c)
, m_iRptTimes(i)
{};
~Node() {};
char m_cCharactor;
int m_iRptTimes;
};
typedef std::vector<Node> StatisticVec;
void get_same_num(const char* src, StatisticVec& output)
{
for ( int i = 0; src[i] != '\0'; i++ )
{
if( output.empty() ) //初始条件下,将第一个字符节点放进vector
output.push_back( Node(src[i], 1) );
else if ( output.back().m_cCharactor == src[i] ) //如果当前的字符与vector末尾字符一致,则增 加该节点的计数。
output.back().m_iRptTimes++;
else //否则,为vector增加一个新的节点
output.push_back( Node(src[i], 1) );
}
}
int main()
{
StatisticVec resultvec;
get_same_num("AAABBBBCCCCCCCC", resultvec);
//算法输出部分与楼主有点不一样
for (int i = 0; i < resultvec.size(); ++i)
printf("%c%d", resultvec[i].m_cCharactor, resultvec[i].m_iRptTimes);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void get_same_num(char* Dest, const char* src)
{
int i, j, k;
int length = strlen(src);
Dest = new char[2 * length+1];
Dest[0] = '\0';
for (i = 1, j = 1; i < length ; i++) {
if (src[i] == src[i-1]) {
j++;
} else {
k = strlen(Dest);
sprintf(Dest + k, "%c%d", src[i-1], j);
j = 1;
}
}
k = strlen(Dest);
sprintf(Dest + k, "%c%d", src[i-1], j);
printf(Dest);
}
int main( )
{
char * Dest = NULL;
get_same_num(Dest,"AAABBBBCCCCCC");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <String.h>
#include <ctype.h>
void Press(char *psrc){
char *pc1 = psrc, *pc2 = psrc;
int icount = 1;
while(*pc1){
if(*(pc1 + 1) != *pc1){
if(icount - 1){
char ca[10] = {0};
pc2++;
itoa(icount , ca, 10);
memcpy(pc2, ca, strlen(ca));
pc2 += strlen(ca);
*pc2 = *(pc1 + 1);
}else{
pc2++;
*pc2 = *(pc1 + 1);
}
icount = 0;
}
icount++;
pc1++;
}
return;
}
char* UnPress(char *psrc){
int icount = 0, inewlen = 1, in = 0, i = 0;
char *pctmp = psrc, *pc = NULL, *p = NULL, c, ca[10] = {0};
while(*pctmp){
if(isalpha(*pctmp)){
inewlen++;
in = atoi(ca) - 1;
memset(ca, 0, 10);
inewlen += in;
icount = 0;
}
if(isdigit(*pctmp)){
ca[icount] = *pctmp;
icount++;
}
pctmp++;
}
in = atoi(ca);
inewlen += in;
pc = (char *)malloc(inewlen);
memset(pc, 0, inewlen);
icount = 0;
in = 0;
memset(ca, 0, 10);
pctmp = psrc;
p = pc;
while(*pctmp){
if(isalpha(*pctmp)){
in = atoi(ca);
memset(ca, 0, 10);
icount = 0;
for(i = 0; i < in - 1; i++){
*p = c;
p++;
}
c = *pctmp;
*p = c;
p++;
}
if(isdigit(*pctmp)){
ca[icount] = *pctmp;
icount++;
}
pctmp++;
}
in = atoi(ca);
for(i = 0; i < in - 1; i++){
*p = c;
p++;
}
/*解压比压缩麻烦些,长度肯定不够*/
return pc;
}
void main(){
char s[]="AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCde", *su = NULL;
Press(s);
printf("%s\n",s);
su = UnPress(s);
printf("%s", su);
if(su)
free(su);
getch();
return;
}