题目描述
实现一个函数,把字符串中的空格替换为%20,例如“we are happy”,转换为“we%20are%20happy”
思路分析:
- 遍历的方法,时间复杂度是n×n
- 采用双指针,从后往前复制数组,遍历统计空格,每增加一个空格,数组长度增加2,设置联两个指针p1,p2,p1指向旧数组的末尾,p2指向新数组的末尾,根据末尾是否是空格分类复制
代码:
public void replaceBlank(char string[],int length){
if(string == null || length <= 0){
return;
}
//保存字符串的实际长度
int originLength = 0;
int numberOfBlank = 0;
int i = 0;
while(string[i] != '\0'){
++originLength;
if(string[i] == ' '){
++numberOfBlank;
}
i++;
}
int newLength = originLength + numberOfBlank*2;
//在剑指offer中,此处是newLength > length,我感觉是它错了,欢迎指正
if(newLength + 1 > length){
return;
}
int indexOld = originLength;
int indexNew = newLength;
//剑指offer中这里是>,我是>=
while(indexOld > 0 || indexNew >= indexOld){
if(string[indexOld] == ' '){
string[indexNew--] = '0';
string[indexNew--] = '2';
string[indexNew--] = '%';
}else{
string[indexNew--] = string[indexOld];
}
indexOld--;
}
}
测试用例
- 输入空格在最前,最后,中间,连续
- 不含空格
- 字符串是null,内容是空,只保含空格
相似问题:
两个已经排序数组a1,a2,假设a1的空间足够大,a2插入a1
总结:
合并或者插入数组或者字符串,从后往前,采用双指针
本文是看完剑指offer整理写成,有部分不同,有待确认。