题目:
实现一个函数,把字符串的每个空格替换成"%20".例如把"We are happy,"输出为
"We%20are%20happy"
解法一:正向扫描字符串,遇到空格就填入"%20",由于要移动空格后面的字符串,假设字符串的 长度为n,则时间复杂度是n*n
解法二:
逆向扫描数组去复制,时间复杂度达到O(n)。因此开的数组要足够大,由于一个空格替换后比原来多两个字符,所以新的长度比原来长 2*(空格数量)
执行过程如下图:
void ReplaceBlank(char string[], int length)//字符串和字符数组预定操作空间
{
if(string == nullptr || length <= 0)
return ;
int numBlank = 0;//空格数目
int numChar = 0;//字符数目
for(int i = 0; string[i] != '\0'; i++)
{
if(string[i] == ' ')
numBlank++;
else
numChar++;
}
numChar++;//加上'\0'这个结尾字符
//cout<<numChar<<endl;
//system("pause");
int orginalLength = numBlank + numChar;//原本长度
int newLength = numBlank*2 + orginalLength;//替换后的长度
//cout<<orginalLength<<" "<<newLength<<endl;
//system("pause");
if(newLength > length)//预留的长度不够
return ;
int p1 = orginalLength - 1;//指向原本字符串的末尾
int p2 = newLength -1; //指向新字符串的末尾
while(p1 >= 0)//没有读完
{
if(string[p1] == ' ')
{
string[p2] = '0';
string[p2 - 1] = '2';
string[p2 - 2] = '%';
p2 -= 3;
p1--;
}
else
{
string[p2] = string[p1];
p1--;
p2--;
}
}
}