题目:请实现一个函数,将字符串中的每个空格替换成%20,例如"we are happy"替换成"we%20are%20happy"
看到这个题目第一反应是:是在原来字符串的基础上修改,还是在copy给另个字符串
第一种:在原来的字符串上修改,这时候需要注意的问题是原来的字符的长度够不够的问题,如果不够这题目就没法做了,假设原来的字符串足够大。这时候想起了直接插入排序和简单选择排序的一点区别:直接插入排序会不断的移动元素原因是不确定每个元素的最终位置,简单选择排序则是不移动元素,因为每一次选出来的元素的位置是确定。那么道题目的问题也在这里如果从正序扫描加替换那么肯定会重复移动一些元素。所以应该先确定每个元素的位置,即找出空格的数量那么所有元素的最终位置也就确定了。
void Replace(char string[])
{
if(string == null)
{
return;
}
int num=0;//记录空格的数量
int length=0;//记录原来的长度
while(string[i] != '\0')
{
length++;
if(string[i]==' ')
{
num++;
}
}//while
int length_now = length+2*num;//现在字符串的长度
while(length>0)
{
if(string[length-1] != ' ')
{
string[length_now-1] = string[length-1];
length_now--;
length--;
}
else
{
string[length_now-1] = '0';
string[length_now-2] = '2';
string[length_now-3] = '%';
length--;
length_now -= 3;
}
}
}
写完后看了下答案发现自己sb了,最后的
<span style="white-space:pre"> </span>string[length_now-1] = '0';
string[length_now-2] = '2';
string[length_now-3] = '%';
的这几句写的实在是业余,直接都写成length_now--;就可以了而且length_now -= 3;也可以省略了if中的也是一样。看来自己还是很业余啊。