题目描述:
请实现一个函数,将一个字符串中的每个空格替换成“%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 用于记录结果字符串的长度;
 
 (2)当 str[length] 不等于空格,就复制,将指针向前移动。
 
 (3)当 str[length]等于空格,将空格变成 “20%”。
 
 重复上述的步骤,直到结束。
分享的代码是由 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];
			}
		}
	}
};
                

















