题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.
思路1:
new一个新的字符串,并在新的字符串上做操作,最后返回这个新的字符串。
可以使用java中的string replace()方法。
public String replaceSpace(StringBuffer str) {
return str.toString().replace(" ", "%20");
}
思路2:
在原始字符串上进行替换
在面试时,需要和面试官交流看看他的需求,以及确定选用哪种方案
Step1.
遍历一遍字符串"We Are Happy.",获取空格的个数,以便计算替换后的新字符串的长度。
新字符串的长度等于原长度加上2乘以空格数。。因为我们将空格替换为“%20”相当于比原来一个空格多了两个字符。
本题中,“We Are Happy.”的长度是13,则新字符串“We%20Are%20Happy.”的长度是13 + 2 * 2 = 17
Java中,字符串不以’\0’为结尾。因为Java中的一切都是对象,字符串也是对象,有自己的长度。
Step2.
从后向前开始复制字符串。定义两个变量i、j。
i初始化为输入字符串的结尾,j初始化为扩充后字符串的结尾。
依次将i指向的字符复制到j指向的字符。当i指向的字符为空格时,在j、j-1、j-2处分别插入"0"、“2”、"%"即可。
Java代码如下:
StringBuffer 的setLength()方法,用于设置字符序列的长度。可以扩充原始字符序列的长度。
StringBuffer 的setCharAt(index, ch)方法,可以设置对应位置上的字符。
public class ReplaceSpace {
public String replaceSpace(StringBuffer str) {
int count = 0;
int oldLen = str.length();
for(int i = 0; i < oldLen; i++) {
if(str.charAt(i) == ' ') {
count++;
}
}
// 新字符串的长度等于原长度加上2乘以空格数
int newLen = oldLen + count * 2;
// setLength()方法,用于设置字符序列的长度。可以扩充原始字符序列的长度。
str.setLength(newLen); //扩展字符串
int i = oldLen - 1;
int j = newLen - 1;
while(i < j) {
if(str.charAt(i) != ' ') {
// setCharAt(index, ch)方法,可以设置对应位置上的字符。
str.setCharAt(j, str.charAt(i));
j--;
} else {
str.setCharAt(j--, '0');
str.setCharAt(j--, '2');
str.setCharAt(j--, '%');
}
i--;
}
return str.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ReplaceSpace r = new ReplaceSpace();
StringBuffer sb = new StringBuffer("We Are Happy.");
String s = r.replaceSpace(sb);
System.out.println(s);
}
}
思考题:
有两个排序后的数组A1和A2,在A1末尾有足够多的空间存储A2,请实现一个方法,把A2中的数字插入到A1中。
和这道题的思路一样,从尾开始,依次比较A1和A2中的数字,把大的存储到A1的末尾。这样就避免了多次移动A1中的数字。
java代码如下:
int[] a = {1,3,5,7,0,0,0};
int[] b = {2,4,6};
int i = 3, j = 2;
int p = 6;
while(i >= 0 && j >= 0) {
if(a[i] < b[j]) {
a[p--] = b[j--];
}else{
a[p--] = a[i--];
}
}
System.out.println(Arrays.toString(a)); // [1, 2, 3, 4, 5, 6, 7]