剑指offier第4题

/*
问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
      从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
      从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
*/
public class Solution {
    public String replaceSpace(StringBuffer str) {
        int spacenum = 0;//spacenum为计算空格数
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)==' ')
                spacenum++;
        }
        int indexold = str.length()-1; //indexold为为替换前的str下标
        int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
        int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
        str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
        for(;indexold>=0 && indexold<newlength;--indexold){ 
                if(str.charAt(indexold) == ' '){  //
                str.setCharAt(indexnew--, '0');
                str.setCharAt(indexnew--, '2');
                str.setCharAt(indexnew--, '%');
                }else{
                    str.setCharAt(indexnew--, str.charAt(indexold));
                }
        }
        return str.toString();
    }
}
package 剑指office;

/*
 * 第四题替换空格
 * 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,
 * 当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 */
    public class ReplaceBlank {
        public String replaceSpace(StringBuffer str) {
            return str.toString().replaceAll("\s", "%20");
            }

        public String replaceSpace1(StringBuffer str) {
            StringBuffer out=new StringBuffer();
            for (int i = 0; i < str.toString().length(); i++) {
                char b=str.charAt(i);
                if(String.valueOf(b).equals(" ")){
                    out.append("%20");
                }else{
                    out.append(b);
                }
            }
            return out.toString();     
        }
        
        
        public String replaceSpace2(StringBuffer str) {
            char[] ch = str.toString().toCharArray();
                int spacenum = 0;
                for(int i =0; i<ch.length; i++){
                    if(ch[i]==' '){
                        spacenum++;
                    }
                }
                char[] ch1 = new char[2*spacenum + str.length()];
                int len = 2*spacenum+str.length()-1;
                for(int i=ch.length-1; i>=0; i--){
                    if(ch[i] != ' '){
                        ch1[len--] = ch[i];
                    }else{
                        ch1[len--] = '0';
                        ch1[len--] = '2';
                        ch1[len--] = '%';
                    }
                }
            return String.valueOf(ch1);
        }
        
        
        public String replaceSpace4(StringBuffer str) {
            int spacenum = 0;//spacenum为计算空格数
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)==' ')
                    spacenum++;
            }
            int indexold = str.length()-1; //indexold为为替换前的str下标
            int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
            int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
            str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
            for(;indexold>=0 && indexold<newlength;--indexold){ 
                    if(str.charAt(indexold) == ' '){  //
                    str.setCharAt(indexnew--, '0');
                    str.setCharAt(indexnew--, '2');
                    str.setCharAt(indexnew--, '%');
                    }else{
                        str.setCharAt(indexnew--, str.charAt(indexold));
                    }
            }
            return str.toString();
        }
        public static void main(String[] args) {
            StringBuffer str = new StringBuffer();
            str.append("We are happy");
            System.out.println(new ReplaceBlank().replaceSpace4(str));
            System.out.println(str.toString());
        }
        
        
    }
    

 这个方法和上一个用for循环的都比较好,没有额外开辟空间,没有改变原来的str

package 剑指office;

/*
 * 第四题替换空格
 * 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,
 * 当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 */
	public class ReplaceBlankDemo {

		public String replaceSpace(StringBuffer str){
			
			int spaceNum =0;
	        for(int i=0;i<str.length();i++){
	        	if(str.charAt(i)==' '){
	        		spaceNum++;
	        	}
	        }
	        int indexOld = str.length()-1;
	        int indexNew = indexOld+2*spaceNum;
	        str.setLength(indexNew+1);
	        while (indexOld>=0) {
				if(str.charAt(indexOld)==' '){
					str.setCharAt(indexNew--, '0');
					str.setCharAt(indexNew--, '2');
					str.setCharAt(indexNew--, '%');

				}else{
					str.setCharAt(indexNew--, str.charAt(indexOld));
				}
				indexOld--;
			}			
			
			return str.toString();
		}
		public static void main(String[] args) {
			StringBuffer str = new StringBuffer();
			str.append("We are happy");
			System.out.println(new ReplaceBlankDemo().replaceSpace(str));
			System.out.println(str.toString());
		}
	}
	

  

原文地址:https://www.cnblogs.com/chengpeng15/p/5801402.html