合并两个数组或者字符串,如果从前往后赋值每个元素,则需要重复移动数字多次,此时可以换着考虑从后往前,可以减少移动次数,从而提高效率
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 24 09:53:42 2017
@author: zzpp220
"""
class ReplaceSpace:
def rePlace1(self,s):
if not s or not isinstance(s,str):
return None
s=s.replace(' ','%20')
return s
def rePlace2(self,s):
if not s or not
isinstance
(s,str):##isinstance判断s是不是字符型
return None
##遍历出空格的总数
countSpace=0
for char in s:
countSpace+=1 if char==' ' else 0
#先新建一个具有空格替换后总长的数组
newstr=(len(s)+countSpace*2)*[None]
p1,p2=len(s)-1,len(newstr)-1
#从后往前遍历,令p1,p2分别为原字符串和替换后字符串的末尾位置,如果p1,p2在长度范围内,并且二者不相等
while p1*p2>=0 and p1!=p2:
#不是空格,则将p1指向的元素依次copy给p2,然后都减1,
if s[p1]!=' ':
newstr[p2]=s[p1]
p1-=1
p2-=1
#遇到空格,则先让p1指向下一个元素,从现在的p2在内开始往前3个分别赋值为%,2,0,完成后让p2从当前位置跳到%之前的位置
else:
p1-=1
newstr[p2-2:p2+1]=['%','2','0']
p2-=3
#循环跳出后,如果p1==p2,则说明,给替换的字符串预留的地方都用完了,即原字符串从后往前的空格都遍历完了,将从头开始到现在的值都原样赋值到新字符串相应的位置
if 0<=p1 and 0<=p2 and p1==p2:
newstr[:p2+1]=s[:p1+1]
##将列表内的字符元素转化为字符串类型
return
''.join(newstr)
if __name__=='__main__':
a=None#3,'we are happy.'' we are happy. ''we are happy.''wearehappy.'
solution=ReplaceSpace()
print solution.rePlace1(a)
print solution.rePlace2(a)