面试题5:替换空格

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如,输入“We are happy.",则输 出“We%20are%20happy.”。
我们可以先遍历-次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。我们还是以前面的字符串"We are happy.“为例。“We are happy.“这个字符串的长度是14 (包括结尾符号"10’),里面有两个空格,因此替换之后字符串的长度是18。我们从字符串的后面开始复制和替换。首先准备两个指针: P1 和P2。PI指向原始字符串的末尾,而P2指向替换之后的字符串的末尾,如图2.4(a) 所示。接下来我们向前移动指针P,逐个把它指向的字符复制到Pz指向的位置,直到碰到第一个空格为止。此时字符串如图2.4(b)所示,灰色背景的区域是进行了字符复制(移动)的区域。碰到第一一个空格之后,把P1向前移动1格,在P2之前插入字符串”%20”。由于”%20"的长度为3,同时也要把P2向前移动3格,如图2.4 ©所示。我们接着向前复制,直到碰到第二个空格,如图2.4 (d)所示。和上一次一样,我们再把P,向前移动1格,并把P2向前移动3格插入"%20",如图2.4 (e)所示。此时P:和P2指向同一-位置,表明所有空格都已经替换完毕。从上面的分析中我们可以看出,所有的字符都只复制(移动)一次,因此这个算法的时间效率是O(n),在这里插入图片描述注:
图中带有阴影的区域表示被移动的字符。(a)把第一个指针指向字符串的末尾,把第二个指针指向替换之后的字符串的末尾。(b)依次复制字符串的内容,直至第一个指针碰到第一个空格。©把第一个空格替换成"%20",把第一个指针向前移动1格,把第二个指针向前移动3格。(d)依次向前复制字符串中的字符,直至碰到空格。(e)替换字符串中的倒数第二个空格,把第一个指针向前移动1格,把第二个指针向前移动3格。

# 面试题5 替换空格
'''
本题有2种方法:
    1.书上的方法,从后往前扫描,减少移动次数。但由于python无法创建固定长度的字符串(除非
        将字符串转换为list),所以都产生一个O(n+x*2)的空间复杂度,其中x为空格的数量。
        时间复杂度为O(n)
    2.利用python的append,从前往后扫描,遇到空格就extend字符串。但如果超过了新建的
        list,会扩容,产生一个移动的损耗。时间复杂度是O(n)

所以遇到这种问题,尝试思考从后面操作。
另外在相关题目中,可以使用的方法有点类似归并排序。
'''

# 面试题5 替换空格
def ReplaceBlank(s3):
    if not isinstance(s3,str):
        return
    lis = list(s3)
    originalLength = len(lis)
    numberOfBlank = 0
    for l in lis:
        if l==' ':
            numberOfBlank+=1
    newLength = originalLength+numberOfBlank*2
    lis_rep = [None]*newLength
    indexofOriginal,indexofnew = originalLength-1,newLength-1
    while indexofOriginal>=0:
        if lis[indexofOriginal]==' ':
            lis_rep[indexofnew]='0'
            lis_rep[indexofnew-1]='2'
            lis_rep[indexofnew-2]='%'
            indexofnew-=3
        else:
            lis_rep[indexofnew] = lis[indexofOriginal]
            indexofnew-=1
        indexofOriginal-=1
    return ''.join(map(str,lis_rep))



def ReplaceBlank1(s3):
    if not isinstance(s3,str):
        return 
    lis = list(s3)
    print(lis,'lis')
    lis_rep = []
    for i in lis:
        if  i==' ':
            lis_rep.extend(list('%20'))
        else:
            lis_rep.append(i)
        print('lis_rep:',lis_rep)
    ss = map(str,lis_rep)
    print('ss',ss)
    return ''.join(ss)

if __name__ == '__main__':
    s1 = ' We are happy '
    s2 = None
    s3 = '    '
    print(ReplaceBlank(s1))
    # print(ReplaceBlank1(s1))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值