面试题4-替换空格

合并两个数组或者字符串,如果从前往后赋值每个元素,则需要重复移动数字多次,此时可以换着考虑从后往前,可以减少移动次数,从而提高效率

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Feb 24 09:53:42 2017
  4. @author: zzpp220
  5. """
  6. class ReplaceSpace:
  7.    def rePlace1(self,s):
  8.        if not s or not isinstance(s,str):
  9.            return None
  10.        s=s.replace(' ','%20')
  11.        return s
  12.        
  13.    def rePlace2(self,s):
  14.        if not s or not isinstance(s,str):##isinstance判断s是不是字符型
  15.            return None
  16.        ##遍历出空格的总数
  17.        countSpace=0
  18.        for char in s:
  19.            countSpace+=1 if char==' ' else 0
  20.        #先新建一个具有空格替换后总长的数组
  21.        newstr=(len(s)+countSpace*2)*[None]
  22.        p1,p2=len(s)-1,len(newstr)-1
  23.        #从后往前遍历,令p1,p2分别为原字符串和替换后字符串的末尾位置,如果p1,p2在长度范围内,并且二者不相等
  24.        while p1*p2>=0 and p1!=p2:
  25.            #不是空格,则将p1指向的元素依次copy给p2,然后都减1,
  26.            if s[p1]!=' ':
  27.                newstr[p2]=s[p1]
  28.                p1-=1
  29.                p2-=1
  30.            #遇到空格,则先让p1指向下一个元素,从现在的p2在内开始往前3个分别赋值为%,2,0,完成后让p2从当前位置跳到%之前的位置
  31.            else:
  32.                p1-=1
  33.                newstr[p2-2:p2+1]=['%','2','0']
  34.                p2-=3
  35.        #循环跳出后,如果p1==p2,则说明,给替换的字符串预留的地方都用完了,即原字符串从后往前的空格都遍历完了,将从头开始到现在的值都原样赋值到新字符串相应的位置
  36.        if 0<=p1 and 0<=p2 and p1==p2:
  37.            newstr[:p2+1]=s[:p1+1]
  38.        ##将列表内的字符元素转化为字符串类型
  39.        return ''.join(newstr)
  40.        
  41. if __name__=='__main__':
  42.    a=None#3,'we are happy.'' we are happy. ''we are   happy.''wearehappy.'
  43.    solution=ReplaceSpace()
  44.    print solution.rePlace1(a)
  45.    print solution.rePlace2(a)
  46.        



附件列表

    原文地址:https://www.cnblogs.com/zzxx-myblog/p/6481235.html