@本博客内容为网上搜集,是个人的学习笔记,非原创性内容,如有冒犯,请联系我撤除!
剑指 Offer算法题
第四题:
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
注意:有几个空格就替换几个空格,如果有连续两个空格也要分别用%20替换
答案:
- 方法一:
配合StringBuffer 的indexOf方法和replace方法。 但是StringBuffer没有方法来判断str里面是否有空格,所以先转换为字符串判断是否有空格。
实现代码:
public class Solution {
public String replaceSpace(StringBuffer str) {
String result = str.toString();
if(result.contains(" ")){
while(str.indexOf(" ") != str.lastIndexOf(" ")){
int index = str.indexOf(" ");
str.replace(index,index+1,"%20");
}
int index = str.indexOf(" ");
str.replace(index,index+1,"%20");
result = str.toString();
return result;
}else{
return result;
}
}
}
- 方法二:对一的改进
StringBuffer的indexOf方法找不到时返回值为-1,那么直接使用-1 来做判断代码简单很多。
public class Solution {
public String replaceSpace(StringBuffer str) {
int index = str.indexOf(" ");
while(index != -1){
str.replace(index,index+1,"%20");
index = str.indexOf(" ",index);
}
String result = str.toString();
return result;
}
}
- 方法三:
不调用replace方法实现
public class Solution {
public String replaceSpace(StringBuffer str) {
int n = str.length();//字符串的长度
int ii = 0;//空格的个数ii
for(int i = 0;i < n;i++){
//检测空格
if(str.charAt(i)==' '){
ii++;
}
}
int nn = 2 * ii + n;//根据空格的个数,得到新数组的长度
int index = nn -1;
char[] ct = new char[nn];//新建数组
while(n > 0){
if(str.charAt(n - 1) != ' '){
//如果不是空格
ct[index--] = str.charAt(n-1);
}
else{
//如果是空格
ct[index--] = '0';
ct[index--] = '2';
ct[index--] = '%';
}
//取下一个字符
n--;
}
return String.valueOf(ct);//将字符数组转为String类型后返回
}
}
方法四:CN-Notes
在字符串尾部填充任意字符,使得字符串的长度等于替换之后的长度。因为一个空格要替换成三个字符(%20),因此当遍历到一个空格时,需要在尾部填充两个任意字符。令 P1 指向字符串原来的末尾位置,P2 指向字符串现在的末尾位置。P1 和 P2 从后向前遍历,当 P1 遍历到一个空格时,就需要令 P2 指向的位置依次填充 02%(注意是逆序的),否则就填充上 P1 指向字符的值。从后向前遍是为了在改变 P2 所指向的内容时,不会影响到 P1 遍历原来字符串的内容。
public String replaceSpace(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();}