题目简述: 替换字符串s中的空格为'%20'
python:
def replaceSpace(self, s):
return s.replace(' ', '%20')
C++:
class Solution {
public:
string replaceSpace(string s) {
if(s.size() == 0) return s;
int originalLength = 0;
int numberOfBlank = 0;
// 统计有多少个字符以及空白字符
for(int i=0; s[i] != '\0'; i++) {
originalLength++;
if(s[i] == ' ') numberOfBlank++;
}
int newLength = originalLength + numberOfBlank*2;
if(newLength > s.size()) s.resize(newLength); // 增加数组内存
int indexOfOriginal = originalLength;
int indexOfNew = newLength;
while(indexOfOriginal >= 0 && indexOfNew >= indexOfOriginal) {
if(s[indexOfOriginal] == ' ') {
s[indexOfNew--] = '0';
s[indexOfNew--] = '2';
s[indexOfNew--] = '%';
} else {
s[indexOfNew--] = s[indexOfOriginal];
}
--indexOfOriginal;
}
return s;
}
};
C:
char* replaceSpace(char* s){
int count = 0; // 记录空格个数
int length = 0; // 记录数组长度
for(int i=0; s[i] != '\0'; i++, length++) {
if(s[i] == ' ') ++count;
}
int newLength = length + count*2;
char* result = malloc(sizeof(char) * (newLength+1));
int indexOfOriginal = length;
int indexOfNew = newLength;
while(indexOfOriginal >= 0 && indexOfNew >= indexOfOriginal) {
if(s[indexOfOriginal] == ' ') {
result[indexOfNew--] = '0';
result[indexOfNew--] = '2';
result[indexOfNew--] = '%';
} else {
result[indexOfNew--] = s[indexOfOriginal];
}
indexOfOriginal--;
}
return result;
}
解析:
-
思路:
a. 统计非结束符字符个数, 确定数组有效长度.
b. 双指针倒序操作, 避免(正序)多次重复移动元素.
c. 通过推算得到增加的数组内存.
-
技巧:
a. C++中的数组resize()等价于C手动malloc(sizeof(type)*len)
b. 多使用自增自减运算符简化代码.
-
对比:
性能上: C>C++>python.