每日一刷——替换空格

题目描述:

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

我的思路:从左向右循环遍历字符串,定义一个空串。如果遇到空格,将空格替换成"20%"并添加到一个新的字符串中,否则将字符添加到新的字符串中。时间复杂度:O(n),空间复杂度O(n)。
不好之处:这样移动的次数多。

str1 = input()
# 方法1:遍历所有,并另外开辟一个空字符串
# 时间复杂度:O(n),空间复杂度O(n)
def replaceBlank(string1):
    string2 = ""
    string3 = "%20"
    for i in range(len(string1)):
        if string1[i] == ' ':
            string2 = string2 + string3
        else:
            string2 = string2 + string1[i]
    return string2
# 先判断该字符串是否为空,养成良好的习惯,对其进行判空操作
if len(str1) == 0:
            return False
str2 = replaceBlank(str1)
print(str2)

查看别人的思路,发现别人都是从右向左倒着遍历的,别人的解析:如果从左向右遇到空格,会将原来的字符覆盖。所以,就考虑了从右向左,如果遇到空格,就填充"20%",否则将原字符移动应该待的位置。
从前往后和从后往前的区别:
从后往前,每个空格后面的字符只需要移动一次。从前往后,当遇到第一个空格时,要移动第一个空格后的所有字符一次;当遇到第二个空格时,要移动第二个空格后所有的字符一次;以此类推,总的移动次数会更多。

下面列一下来自牛客的官方解题思路,我虽然明白了这个思路,但是由于 python 的字符串是不可变的,一旦创建,就不能修改它的值(注意:使用“+”运算符连接字符串时,两个字符串之间不能有空格,否则会报错),如果要对其进行再增加长度,相当于又重新新建一个字符串对象,那我更倾向于我上面的第一种解决方案。
(1)length 用于记录原字符串的长度,new_length 用于记录结果字符串的长度;
每日一刷——替换空格_第1张图片
(2)当 str[length] 不等于空格,就复制,将指针向前移动。
每日一刷——替换空格_第2张图片
(3)当 str[length]等于空格,将空格变成 “20%”。
每日一刷——替换空格_第3张图片
重复上述的步骤,直到结束。

分享的代码是由 C++ 编写的。
时间复杂度O(n),空间复杂度O(1)。

class Solution {
public:
	void replaceSpace(char *str,int length) {
		// 判空操作
		if(str == nullptr || length <= 0) return;
		int countb = 0;
		// 计算字符串中有多少个空格
		for(int i=0; i<length; ++i)
		{
			if (str[i] == ' ')
			{
				++countb;
			}
		}
		// 如果没有空格,直接返回
		if( countb==0 ) return;
		int new_length = length + countb*2;
		// 当i==new_length时,说明前面已经没有空格了,可以节约一定的时间
		for(int i = length-1; i>=0 && i!=new_length; --i){
			if(str[i] == ' '){
				str[--new_length] = '0';
				str[--new_length] = '2';
				str[--new_length] = '%';
			}
			else{
				str[--new_length] = str[i];
			}
		}
	}
};

你可能感兴趣的:(python学习之路,python,算法,开发语言)