实现一个函数将字符串中的空格替换成#20
输入:ni hao ya
输出:ni%20hao%20ya
其中我们有两个思路,一个是O(N²)的复杂度,将数组遍历,然后在空格处插入#20,但是每次插入都需要后移内存,十分的费时间,所以我们还是从中寻找规律
我们先遍历一遍数组,找出他其中的空格数量,用两个指针,一个指向数组尾部,一个指向数组尾部+最后要的偏移量,然后向前遍历,两个指针一起向后移动,后面的指针不断的去拷贝前面指针的数据,当遇到空格的时候,后面的指针去做赋值操作#20
注:其中需要注意的就是数组越界和字符串尾0的标志
代码实现
void arry_change(char buf[], int len)
{
if (buf == nullptr || len <= 0)
return;
int bank_num = 0;
int originalen = 0;
int i = 0;
while (buf[i] != '\0')
{
if (buf[i] == ' ')
bank_num++;
originalen++;
i++;
}
int new_len = originalen + 2 * bank_num;
if (new_len > len) //如果数组越界的话就返回
return;
//核心移动的实现
while (new_len !=originalen &&originalen>=0)
{
if (buf[originalen] == ' ')
{
buf[new_len--] = '0';
buf[new_len--] = '2';
buf[new_len--] = '%';
}
else
{
buf[new_len--] = buf[originalen];
}
originalen--;;
}
}
测试用例
- 有空格的字符串
- 无空格的字符串
- 特殊输入,数组越界,空指针,数组中有多个连续空格,输入只有一个空格