剑指offer:替换空格
题目
题目链接
剑指offer:替换空格
题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路
这题是很简单的字符串替换问题,最容易想到的就是从前往后依次替换,比较让人困惑的是所给函数形参中length
的作用。
在查看题目的讨论区时,发现从后往前替换会明显优于从前往后的替换,因为在前者的替换过程中,不需要进行字符的移动,能够大幅度提升效率。在下文中给出的是更优的从后往前替换的代码。同时,讨论区中,大家认为题中的length
指的是需返回字符串的最大长度,这一要求也在代码中有体现。
具体代码
1.从后往前替换字符串
class Solution {
public:
void replaceSpace(char *str,int length) {
// 排除非法字符串的可能
if (str == NULL || length < 0) {
return;
}
// 初始化字符串原始长度、字符串目标长度、字符串中空格数
int oldLength = 0;
int newLength = 0;
int spaceNumber = 0;
// 遍历字符串求出上述参数
for (int i = 0; str[i] != '\0'; i++) {
oldLength++;
if (str[i] == ' ') {
spaceNumber++;
}
}
newLength = oldLength + spaceNumber * 2;
// 如果目标长度大于给出长度要求则结束函数
if (newLength > length) {
return;
}
// 从后往前处理字符串
for (int i = oldLength; i >= 0; i--) {
if (str[i] == ' ') {
str[newLength--] = '0';
str[newLength--] = '2';
str[newLength--] = '%';
} else {
str[newLength--] = str[i];
}
}
}
};