URL化。编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。(注:用Java实现的话,请使用字符数组实现,以便直接在数组上操作。)
示例1:
输入:"Mr John Smith ", 13
输出:"Mr%20John%20Smith"
示例2:
输入:" ", 5
输出:"%20%20%20%20%20"
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. 第一种解法非常容易想到,再次初始化一个空字符串,然后遍历原来的字符串,如果遇到空格,则在其后面添加“%20”,如果没有遇到空字符,则添加当前遍历的字符;这种做法的缺点也是相当明显的,我们另外开辟了一个空间;
class Solution:
def replaceSpaces(self, S: str, length: int) -> str:
s = ""
num = 0
for strs in S:
if strs != " " and num < length:
s += strs
num+= 1
elif strs == " " and num<length:
s += "%20"
num+=1
return s
2. 由于开辟空间的方式带来的弊端的是需要开辟新的空间对其进行相应计算,那么我们自然想到不开辟相关的空间计算,所以要在原来的空间上完成空格字符的“%20”插入的操作,这里的技巧是我们要从后向前进行插入(插入后的数组的长度是我们可以预先知道的),因为这样会减小空间的移动,如果从前往后进行处理, 在前面字符插入时,会带来后面字符的移动,这样显得非常麻烦,后面的问题就是我们如何计算对应相关位置;
下面是C++代码的相关实现:
class Solution {
public:
string replaceSpaces(string S, int length) {
if(S.empty())
return S;
//计算转化后的长度
int cnt = 0;
for(int i = 0; i<length; i++){
if(S[i] == ' ')
cnt++;
}
int newLen = length+cnt*2, j = newLen-1;
for(int i = length-1; i>=0 && i!=j; i--){
if(S[i] == ' '){
S[j--] = '0';
S[j--] = '2';
S[j--] = '%';
}else{
S[j--] = S[i];
}
}
S[newLen] = '\0';
return S;
}
};


1295

被折叠的 条评论
为什么被折叠?



