剑指offer:Python 替换空格

题目描述

'''
请实现一个函数,将一个字符串中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
'''

思路过程

'''
Python字符串,有replace方法,可以实现替换,第一个参数是要替换的内容,第二个参数是替换的新内容
能够快速完成,果然Python作为一种高级语言,不太适合做算法;但是 replace 相当于“insert”,在替换
时,会将原字符串元素的位置移动,导致时间复杂度增加!
'''

Python实现

def replace_space(str_num):
	# return str_num.replace(' ', "%20")
    new_str = []
    for i in range(len(str_num)): # 将每一个元素遍历,然后再放到新列表
        if str_num[i] == " ":
            new_str.append("%20")
        else:
            new_str.append(str_num[i])
    return "".join(new_str)


print(replace_space('We Are Happy'))
'''
整个过程,元素没有在替换一个元素时移动,时间复杂度O(n)=n
'''
# 一种更省空间的做法,耗时差不多!C语言思路
# 摘自:https://blog.csdn.net/ggdhs/article/details/89814919

def replace_space( s):
    if s == None:
        return None
    li1 = len(s)  # 原字符串的长度
    space_number = 0  # 用来记录空格的数目
    for i in range(len(s)):
        if s[i] == " ":
            space_number += 1
    li2 = li1 + 2 * space_number
    # 因为一个空格要用% 2 0三个字符来替换,因此也就是原字符串有一个空格,新字符串的长度就要加2
    str_data = [1] * li2  # 生成一个长度为li2的列表,用来填充
    # 设置两个指针,分别指向s和str_data的尾部
    p1 = li1 - 1
    p2 = li2 - 1
    while p1 >= 0:  # 设置循环终止条件
        if s[p1] != " ":  # 如果s当前的空格不为空,直接落下即可。
            str_data[p2] = s[p1]
            p1 -= 1  # 更新p1和p2
            p2 -= 1
        else:  # 如果为空,那么就要用%20来替换了
            str_data[p2] = "0"
            str_data[p2 - 1] = "2"
            str_data[p2 - 2] = "%"
            p1 -= 1
            p2 -= 3
    return "".join(str_data)


print(replace_space('We Are Happy'))


'''
从后往前遍历字符串,判断当前字符是不是空格,如果是,就用20%替换。
这样替换空格之后的字符不用每次再往后移动两个位置。
具体来说,可以这样去想:
1.先从后往前遍历字符串,得到整个字符串中的空格数和字符数,原始字符串的长度为l1,空格数为n。
然后进一步生成长度为l2的新的字符串(用于替换),其中l2 = l1+2*n;
2.重新生成一个长度为l2的新的字符串str,以便后面进行替换;
3.设置两个指针,p1和p2,用来分别指向新旧两个字符串,出初始值分别设置为l1-1和l2-1(从后往前遍历);
4.从后往前遍历,如果当前的字符不是空格,那么str[p2] = s[p1],并更新p1和p2;如果当前的字符是空格,
那么str[p2]=0,str[p2-1]=2,str[p2-2]=%,然后更新p1为p1-1,p2为p2-3;
5.当循环结束时,将新字符串str用join连接起来。
'''
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值