@剑指offer(Python)替换空格

剑指offer刷题笔记2(Python)

题目描述

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

思路1

可以从前往后遍历字符串, 并判断当前字符是不是空格,如果是空格的话,就将空格用20%代替。但是这种方法,效率较低,因为每替换一次空格,都要将原字符串中当前被替换空格之后的字符往后移动两个位置。因此还可以对思路进行优化。

思路2

从后往前遍历字符串,判断当前字符是不是空格,如果是,就用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连接起来。

代码

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

猜你喜欢

转载自blog.csdn.net/ggdhs/article/details/89814919