欢迎关注公众号:
题目描述:
思路分析:
有以下几种方法来解决这个问题:
(1)在string中,有一种方法为replace,可以直接将空格替换为%20.
(2)定义新字符串,有空格则长度加3,然后依次遍历原来字符串,有空格则将%20添加到新字符串中。
① 在字符串尾部填充任意字符,使得字符串的长度等于替换之后的长度。因为一个空格要替换成三个字符(%20),所以当遍历到一个空格时,需要在尾部填充两个任意字符。
② 令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。
③ 当 P2 遇到 P1 时(P2 <= P1),或者遍历结束(P1 < 0),退出。
(3)申请一个临时数组,然后再遍历这个字符串的每个字符,如果不是空格就把遍历的字符添加到临时数组中,
如果是空格就添加3个字符'%','2','0'分别到临时数组中,最后再把临时数组转化为字符串即可。
(4)用StringBuffer来实现,遍历字符串,依次加入到StringBuffer中,遇到空格则加入%20,然后返回StringBuffer。
(5)采用栈的思想实现替换空格,数据依次入栈,有空格则加入%20,然后依次出栈,如下图所示。
实现代码如下:
package JavaOffer;
import java.util.Stack;
public class JavaOffer5 {
public static void main(String[] args) {
StringBuffer str=new StringBuffer("hello world");
JavaOffer5 javaOffer5 = new JavaOffer5();
String str1="hello world";
String string=javaOffer5.solution1(str1);
System.out.println("方法一");
System.out.println("替换前的数组为"+str1 );
System.out.println("替换后的数组为"+string );
}
public String solution1(String str){
str=str.replace(" ","%20");
return str;
}
public String solution2(StringBuffer str) {
int P1 = str.length() - 1;
for (int i = 0; i <= P1; i++)
if (str.charAt(i) == ' ')
str.append(" ");
int P2 = str.length() - 1;
while (P1 >= 0 && P2 > P1) {
char c = str.charAt(P1--);
if (c == ' ') {
str.setCharAt(P2--, '0');
str.setCharAt(P2--, '2');
str.setCharAt(P2--, '%');
} else {
str.setCharAt(P2--, c);
}
}
return str.toString();
}
/*
申请一个临时数组,然后再遍历这个字符串的每个字符,如果不是空格就把遍历的字符添加到临时数组中,
如果是空格就添加3个字符'%','2','0'分别到临时数组中,最后再把临时数组转化为字符串即可
*/
public String solution3(String string){
int length =string.length();
char [] tmplist =new char[3*length];
int index=0;
for (int i = 0; i< length; i++) {
char c=string.charAt(i);
if (c==' '){
tmplist[index++]='%';
tmplist[index++]='2';
tmplist[index++]='0';
}else {
tmplist[index++]=c;
}
}
String newString =new String(tmplist,0,index);
return newString;
}
public String solution4(String string){
StringBuffer stringBuffer=new StringBuffer();
for (int i = 0; i <string.length() ; i++) {
if (string.charAt(i)==' '){
stringBuffer.append("%20");
}else {
stringBuffer.append(string.charAt(i));
}
}
return stringBuffer.toString();
}
public String solution5(String string) {
Stack<Character> stack = new Stack<>();
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
if (string.charAt(i) == ' ') {
stack.push('%');
stack.push('2');
stack.push('0');
} else {
stack.push(string.charAt(i));
}
}
for (char ele :stack){
stringBuffer.append(ele);
}
return stringBuffer.toString();
}
}
上述代码运行结果为: