题目描述:
请实现一个函数,将一个字符串中的每个空格替换成“%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];
}
}
}
};