将给定字符串中连续出现3次的小写字母替换为改小写字母在字母表中的下一个字母(z变为a),大写字母和其他字符不处理,仍然保留。要求最终输出的字符串中不再存在任何连续出现3次的小写字母。
例如字符串”ATRcccert893#45ae”经过处理后应该为”ATRdert893#45ae”
详细描述:
接口说明
原型:
int ChangeString(char *pInStr,char *pOutStr)
输入参数:
char *pInStr 输入字符串
输出参数:
char *pOutStr 输出字符串,内存空间已分配好,可直接使用
返回值:
int 0:处理成功 -1:出现异常
限制:
无
举例:
pInStr:jkds*^*(HKEEEklIdddjilfff
pOutStr:jkds*^*(HKEEEklIejilg
我的第一份代码:
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "oj.h"
int ChangeString(char *pInStr,char *pOutStr)
{
int len = strlen(pInStr);
int k = 0;
if(pInStr == NULL || '\0' == *pInStr)
return -1;
for(int i = 0; i < len - 2; ++i)
{
if(islower(pInStr[i]) && pInStr[i] == pInStr[i+1] && pInStr[i] == pInStr[i+2])
{
if(pInStr[i] == 'z')
pOutStr[k++] = 'a';
else
pOutStr[k++] = pInStr[i] + 1;
i += 2;
}
else
pOutStr[k++] = pInStr[i];
}
pOutStr[k] = '\0';
return 0;
}
显然,这个代码并不能循环,对于连续多个字母并不是有效的。于是有了下面的代码:
#include <stdlib.h>
#include <string.h>
#include "oj.h"
int ChangeString(char *pInStr,char *pOutStr)
{
int len;
bool bChange;
if(NULL == pInStr || '\0' == *pInStr)
return -1;
strcpy(pOutStr, pInStr);
do
{
bChange = false;
len = strlen(pOutStr);
for(int i = 0; i < len; ++i)
{
char *pCur = pOutStr + i;
if(*pCur != '\0'
&& *(pCur + 1) != '\0'
&& *(pCur + 2) != '\0'
&& *pCur == *(pCur + 1)
&& *pCur == *(pCur + 2)
&& *pCur >= 'a'
&& *pCur <= 'z')
{
if(*pCur == 'z')
*pCur = 'a';
else
++(*pCur);
int j;
for(j = 3; *(pCur + j) != '\0'; ++j)
*(pCur + j - 2) = *(pCur + j);
*(pCur + j - 2) = '\0';
bChange = true;
break;
}
}
}while(bChange);
return 0;
}