【剑指offer】 字符串替换

题目

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。


1、
为了减少插入时字符串的移位消耗,可生成一个对象去进行append操作,而不是在原来字符串进行插入操作;
为了减少不必要的append,可以通过start和end确定要进行append的子串,通过判断是否为空格进行append的时机;

public static String replaceSpace(StringBuffer str) {
    StringBuffer stringBuffer=new StringBuffer();
    int start=0;
    int end=0;
    int lenght=str.length();
    while (end<lenght){
        //计算从何处开始append,减少append次数
        if (str.charAt(end)!=' '){
            end++;
        }else {//当char 等于空格时开始替换
            stringBuffer.append(str.substring(start,end)).append("%20");
            end++;
            start=end;
        }
    }
    stringBuffer.append(str.substring(start,end));//最后一次,将末尾start,end的子串插入
    return stringBuffer.toString();
}

2、 不新生成对象,采用统计空格数,重新赋值字符串长度,然后采用从尾部赋值的操作方式,减少移位,提升效率。

 public static String replaceSpace2(StringBuffer str) {
    int count=0;
    int oldlen=str.length();
   for (int i=0;i<oldlen;i++){//计算空格数
       if (str.charAt(i)==' ')
           count++;
   }
   int newlen=oldlen+count*2; //计算新字符串长度
   str.setLength(newlen);
    for (int i=oldlen-1;i>=0;i--){//从尾开始进行赋值操作,避免从头部操作时的char的移位
        char data=str.charAt(i);
        if (data!=' '){//如果不等于空格则直接赋值
            str.setCharAt(--newlen,data);
        }
        else {//如果等于空格,则赋值%20
            str.setCharAt(--newlen,'0');
            str.setCharAt(--newlen,'2');
            str.setCharAt(--newlen,'%');
        }
    }
    return str.toString();
}

猜你喜欢

转载自blog.csdn.net/weixin_37902491/article/details/82224225
今日推荐