原题请参考:http://www.oschina.net/code/snippet_270597_35306
#include <stdio.h>
/*----------------------------------------------------------------------------------------
* 题目一:通过键盘输入一串小写字母(a~z)组成的字符串。
* 请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
* 比如字符串“abacacde”过滤结果为“abcde”。
*
* 要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);
*
*【输入】 pInputStr: 输入字符串
* lInputLen: 输入字符串长度
*【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
*
*【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
*
* 示例
* 输入:“deefd” 输出:“def”
* 输入:“afafafaf” 输出:“af”
* 输入:“pppppppp” 输出:“p”
-------------------------------------------------------------------------------------------*/
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
{
unsigned int nInput = 0;
long nIndexOutputStr = 0;
for (long nIndexInputStr = 0; nIndexInputStr < lInputLen; nIndexInputStr++)
{
int nMoveNum = pInputStr[nIndexInputStr] - 'a';
unsigned int nPlace = 1 << nMoveNum;
if ((nInput&nPlace) == 0)
{
nInput = nInput | nPlace;
pOutputStr[nIndexOutputStr++] = pInputStr[nIndexInputStr];
}
}
pOutputStr[nIndexOutputStr] = '\0';
}
/*--------------------------------------------------------------------------------------------
* 题二:题目描述(40分):
* 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母
* 进行压缩,并输出压缩后的字符串。
* 压缩规则:
* 1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
* 2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
*
* 要求实现函数:
* void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
*
*【输入】 pInputStr: 输入字符串
* lInputLen: 输入字符串长度
*【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
*
*【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
*
* 示例
* 输入:“cccddecc” 输出:“3c2de2c”
* 输入:“adef” 输出:“adef”
* 输入:“pppppppp” 输出:“8p”
--------------------------------------------------------------------------------------------*/
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
char cLetter = ' ';
long nLetterNum = 0;
long nIndexOutputStr = 0;
for (long nIndexInputStr = 0; nIndexInputStr < lInputLen; nIndexInputStr++)
{
if (cLetter == pInputStr[nIndexInputStr])
{
nLetterNum++;
}
else
{
if (nLetterNum > 1)
{
nIndexOutputStr += sprintf_s(pOutputStr + nIndexOutputStr, lInputLen - nIndexOutputStr, "%d%c", nLetterNum, cLetter);
nLetterNum = 0;
}
else if(nLetterNum == 1)
{
pOutputStr[nIndexOutputStr++] = cLetter;
nLetterNum = 0;
}
cLetter = pInputStr[nIndexInputStr];
nLetterNum = 1;
}
}
if (nLetterNum > 1)
{
nIndexOutputStr += sprintf_s(pOutputStr + nIndexOutputStr, lInputLen - nIndexOutputStr, "%d%c", nLetterNum, cLetter);
nLetterNum = 0;
}
else if (nLetterNum == 1)
{
pOutputStr[nIndexOutputStr++] = cLetter;
nLetterNum = 0;
}
pOutputStr[nIndexOutputStr] = '\0';
}
int main()
{
char cStr[20];
stringFilter("deefd", 5, cStr);
printf("%s\n", cStr);
stringFilter("afafafaf", 8, cStr);
printf("%s\n", cStr);
stringFilter("pppppppp", 8, cStr);
printf("%s\n", cStr);
stringZip("cccddecc", 8, cStr);
printf("%s\n", cStr);
stringZip("adef", 4, cStr);
printf("%s\n", cStr);
stringZip("pppppppppppp", 12, cStr);
printf("%s\n", cStr);
getchar();
return 0;
}