zoukankan      html  css  js  c++  java
  • 剑指offer-替换空格

    剑指offer中的第二题替换空格的写法,以下给出Python、C++的写法。

    Python写法

    运行时长约30 ms

    class Solution:
        # s 源字符串
        def replaceSpace(self, s):
            newstr=s.replace(' ','%20')
            return newstr
    

    C++写法

    class Solution {
    public:
    	void replaceSpace(char *str,int length) {
            for(int i = 0; i<length ; i++){
                if(str[i]==' '){//如果存在空格
                    //then replace
                    for(int j = length+1;j>=i+3;j--){//把后面的往后移动两个单位
                        str[j]=str[j-2];
                    }
                    str[i]='%';
                    str[i+1]='2';
                    str[i+2]='0';
                    length+=2;
                }
            }
    	}
    };
    

    运行时长约7 ms,但是还可以优化。上述的方式是将字符串从前往后遍历的,如果从后往前遍历的话将更节省时间,因为从前往后遍历,每遇到一个空格需要将后面所有字符后移两个单位,但是如果提前将要往后移动的空格数量统计出来然后从后往前遍历,那么每次移动只需要动空格与空格之间的内容了,避免了多次移动。

    class Solution {
    public:
    	void replaceSpace(char *str,int length) {
            if(str==NULL||length<0)
                return ;
            int i=0;
            int oldnumber=0;//记录以前的长度
            int replacenumber=0;//记录空格的数量
            while(str[i]!='')
                {
                   oldnumber++;
                   if(str[i]==' ')
                       {
                         replacenumber++;
                       }
                      i++; 
                }
            int newlength=oldnumber+replacenumber*2;//插入后的长度
            if(newlength>length)//如果计算后的长度大于总长度就无法插入
                return ;
            int pOldlength=oldnumber; //注意不要减一因为隐藏个‘’也要算里
            int pNewlength=newlength;
            while(pOldlength>=0&&pNewlength>pOldlength)//放字符
                {
                  if(str[pOldlength]==' ') //碰到空格就替换
                      {
                         str[pNewlength--]='0';
                         str[pNewlength--]='2';
                         str[pNewlength--]='%';
                      }
                 else //不是空格就把pOldlength指向的字符装入pNewlength指向的位置
                   {
                        str[pNewlength--]=str[pOldlength];
                   }
                 pOldlength--; //不管是if还是elsr都要把pOldlength前移
               }
    	}
        
    };
    

    经过优化,运行时长约为 4 ms。

    Java写法

    public class Solution {
        public String replaceSpace(StringBuffer str) {
            if(str==null)return null;
        	return str.toString().replaceAll(" ","%20");
        }
    }
    
    keep going
  • 相关阅读:
    .NET中TreeView控件从数据库获取数据源
    .NET中GridView控件的全选删除
    TreeView无限极分类绑定(从数据库读取数据源)
    .NET中GridView代码更改列名
    .NET读写cookie方法
    .NET中GridView控件的高亮显示和删除前弹框提示
    Repeater控件的多层嵌套,DataList控件的多层嵌套
    .NET一些常用的语句集合(不断更新中)
    解决IE5、IE6、IE7与W3C标准的冲突,使用(IE7.js IE8.js)兼容
    kindeditor富文本编辑器ASP.NET源码下载
  • 原文地址:https://www.cnblogs.com/MarkKobs-blog/p/10344320.html
Copyright © 2011-2022 走看看