题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路
因为从前向后扫描字符串,遇到空格添加“%20”,这种方式需要对后面的字符串进行多次复制移动,效率不高。
我们可以反过来,从后向前进行复制和替换,每替换一个空格,长度增加2,所以最终替换的新字符串的长度=原长度+空格数*2。我们将oldIndex和newIndex分别代表原字符串的末尾和新字符串的末尾,判断oldIndex对应的字符是否为空格,若是空格则向newIndex依次添加‘0’,‘2’,‘%’这三个字符,并且同时移动oldIndex和newIndex相应的距离;若oldIndex对应的字符不是空格,则将oldIndex的字符复制进newIndex对应的位置,并且同时移动oldIndex和newIndex,直到oldIndex和newIndex相遇,表明我们填充完后添加的长度(空格数*2),所有的空格都已经替换完成。
代码:
public String replaceSpace(StringBuffer str) {
int spaceNum = 0;
// 遍历字符串得到空格的个数
for(int i=0;i<str.length();i++){
if(str.charAt(i) == ' '){
spaceNum++;
}
}
int oldLength = str.length();
int newLength = oldLength + spaceNum * 2;
// 对原有的字符串长度进行扩容
str.setLength(newLength);
// 从后向前遍历数组
int oldindex = oldLength - 1;
int newindex = newLength - 1;
while(oldindex != newindex){
if(str.charAt(oldindex) != ' '){
str.setCharAt(newindex, str.charAt(oldindex));
// 向前同时移动
oldindex--;
newindex--;
}else {
oldindex-- ;
// 向新字符串添加%20
str.setCharAt(newindex,'0');
str.setCharAt(newindex-1,'2');
str.setCharAt(newindex-2,'%');
newindex = newindex - 3;
}
}
return str.toString();
}
类似题目:
有两个排序的数组a和b,内存在a的末尾有足够的空间容纳b,请实现一个函数,把b中的所有数字插入到a中,并且所有的数字是排序的。
public int[] mergeArray(int[] a, int[] b){
int i = a.length - b.length - 1;
int k = b.length - 1;
int j = a.length - 1;
while(i>=0 && k >= 0){
if(a[i] >= b[k]){
a[j--] = a[i--];
}else {
a[j--] = b[k--];
}
}
if(i > 0){
while(i >= 0){
a[j--] = a[i--];
}
}
else {
while(k >= 0){
a[j--] = a[k--];
}
}
return a;
}