zoukankan      html  css  js  c++  java
  • 剑指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());
    		}
    	}
    	
    

      

  • 相关阅读:
    ibatis resultMap 结果集映射
    iabtis初探
    struts2获取请求参数的三种方式及传递给JSP参数的方式
    Struts2的运行机制简介
    Spring AOP面向切面编程的实现
    java 单例模式及getInstance的好处
    It is indirectly referenced from required .class files
    AngularJS学习篇(二)
    AngularJS学习篇(一)
    Flex布局语法
  • 原文地址:https://www.cnblogs.com/chengpeng15/p/5801402.html
Copyright © 2011-2022 走看看