题目来自剑指Offer
题目
思路:从后往前替换,减少数据移动次数,时间复杂度为O(n)
代码:
#include <iostream>
#include <assert.h>
using namespace std;
/*
假设替换后,原数组仍然可以放下,
数组strArr:存储待处理字符串,length:存储数组长度*/
void RaplaceBlank(char strArr[],int length)
{
assert(strArr != NULL && length > 0);
int nCountOfBlank = 0;
int nLenOfOldArr = 0;
int nLenOfNewArr = 0;
char* pCur = strArr;
char* pCurOfNew = NULL;
//统计空格个数
while (*pCur)
{
nLenOfOldArr++;
if (*pCur == ' ')
{
nCountOfBlank++;
}
pCur++;//容易忘记写。注意
}
if (0 == nCountOfBlank)
{
return;
}
//计算新字符串的长度
nLenOfNewArr = nCountOfBlank * 2 + nLenOfOldArr;
//替换空格
//设置两个指针的指向
pCurOfNew = strArr + nLenOfNewArr - 1;
pCur = strArr + nLenOfOldArr - 1;
while (0 != nLenOfOldArr)
{
if (*pCur != ' ')
{
*pCurOfNew = *pCur;
}
else
{
*pCurOfNew = '0';
pCurOfNew--;
*pCurOfNew = '2';
pCurOfNew--;
*pCurOfNew = '%';
}
nLenOfOldArr--;
pCur--;
pCurOfNew--;
}
//设置新字符串的结束字符
strArr[nLenOfNewArr] = 0;
}
int main()
{
char strArr[20];
cin.getline(strArr,20);
RaplaceBlank(strArr,20);
cout<<strArr<<endl;
system("pause");
return 1;
}
注意:
1、使用cin输入数据时,字符串首部和尾部是不能含有空格的。因此测试程序时不能使用cin。
2、容易忘记写指针的移动。