剑指Offer每日一刷 -2017年11月11日

来源:互联网 发布:java锁的种类 编辑:程序博客网 时间:2024/05/19 03:28

题目描述

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
方法一:使用JDK API进行替换
public class ReplaceBackspace {    public String replaceSpace(StringBuffer str) {    String string = str.toString();    String replace = string.replace(" ", "%20");    return replace;    }}

方法二:
/*
问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
      从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
      从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
思路是:1.先计算出str中有多少个 空格;
2.计算出将空格替换成"%20"后,str的长度newLength
3.设置str的长度为newLength,长度会增加,新增加的长度没有值
4.对str按照原有长度从后向前遍历,将每个字母按照新的长度从后向前进行赋值,
赋值到后面之后字母所在的原位置就可以被其他符号占用,且不会影响到原有的字符。
5.遇到空格后,插入'0','2','%'
*/
 public String replaceSpace(StringBuffer str){    //统计str中的space个数    int spaceNum = 0; //记录space的个数    for(int i=0;i < str.length();i++){    if(str.charAt(i) == ' '){ //判断i索引处的char字符是否是' '    spaceNum ++;    }    }        int oldLength = str.length();    int newLength = str.length()+ spaceNum*2; //%20占有三个字符才长度,所以在原有的space的基础上添加spaceNum*2        int oldIndex  = oldLength-1;    int newIndex = newLength-1;        //StringBuffer newStr;    str.setLength(newLength);    //对已有的str从后向前遍历,遇到 ' '时 插入'%', '2','0'    for(;oldIndex>=0 && oldIndex < newLength;--oldIndex){    if(str.charAt(oldIndex) == ' '){    str.setCharAt(newIndex--,'0');    str.setCharAt(newIndex--, '2');    str.setCharAt(newIndex--, '%');    }else{    str.setCharAt(newIndex--, str.charAt(oldIndex));    }    }    return str.toString();        }

方法三:
 public static String replaceSpace(StringBuffer str){   if(str==null)   {return "%20";}       char[] ss = str.toString().toCharArray();   StringBuffer sb = new StringBuffer();   for(int i=0;i<ss.length;i++){   if(ss[i] == ' '){   sb.append("%20");   }else{   sb.append(ss[i]);   }   }   return sb.toString();   }





原创粉丝点击