合并两个数组或者字符串,如果从前往后赋值每个元素,则需要重复移动数字多次,此时可以换着考虑从后往前,可以减少移动次数,从而提高效率
# -*- 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 Nones=s.replace(' ','%20')return sdef rePlace2(self,s):if not s or notisinstance(s,str):##isinstance判断s是不是字符型return None##遍历出空格的总数countSpace=0for 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-=1p2-=1#遇到空格,则先让p1指向下一个元素,从现在的p2在内开始往前3个分别赋值为%,2,0,完成后让p2从当前位置跳到%之前的位置else:p1-=1newstr[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)
附件列表
浙公网安备 33010602011771号