面试题4-替换空格
基础知识
在Java和C#这样面向对象的语言中,字符串String是以对象的形式存在的,当初始化一个String对象之后,它的内容就是不能被改变的,一旦视图改变String的内容就会产生一个新的实例。对String的操作都是生成一个新的String实例并在返回值中返回。因此,如果对String做连续的修改,每一次的修改都会产生一个临时对象,这样的开销太大会影响效率。在Java中,定义了两个与字符串相关的类型:StringBuilder和StringBuffer,这两个类型的能更好的对字符串进行修改,容纳修改后的结果。
StringBuffer和StringBuilder的区别在这里说明。
题目
请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入"We are happy",则输出"We%20are%20happy"。
解题思路
首先从前往后遍历一边字符串,统计字符串中空格的数目,以此为基础统计替换之后字符串的总长度。
从后往前准备两个指针,P1和P2,同时移动P1和P2,把P1指向的字符复制到P2的位置上去,直到P1遇到空格,P1向前移动一个字符,在P2之前插入"%20",并向前移动3个字符。
重复上述过程,直到P1和P2相遇为止。
所有的字符在这个过程中都只移动一次,这个算法的复杂度为O(n)。
代码
- public class Solution {
- public String replaceSpace(StringBuffer str) {//注意这里使用的StringBuffer
- int len = str.length();
- if( str == null || len <=0)
- return "";
- int blankNums = 0;
- for(int i = 0; i < len; i++){
- if(str.charAt(i) == ' ')
- blankNums ++;
- }
- if(blankNums == 0)
- return str.toString();
- int newlength = len + blankNums * 2;
- str.setLength(newlength);
- int index1 = len - 1;
- int index2 = newlength - 1;
- while(index1 >= 0 && index2 > index1){
- if(str.charAt(index1) == ' '){
- str.setCharAt(index2,'0');
- index2 --;
- str.setCharAt(index2, '2');
- index2 --;
- str.setCharAt(index2, '%');
- index2 --;
- }else{
- str.setCharAt(index2, str.charAt(index1));
- index2 --;
- }
- index1 --;
- }
- return str.toString();
- }
- }