《剑指Offer》05 “替换空格”(c++)
牛客
- 根据测试同样的代码每次时空占用都不同,甚至时间上可能出现2ms~7ms的差距
①原版(原string自后向前遍历)
原string向后扩展,自后向前遍历
运行时间:2ms 占用内存:504KB
string replaceSpace(string s) {
// write code here
int len = s.length();
if (len <= 0) return s; //s == nullptr无效
int originalLen = 0;
int numOfBlank = 0;
int i = 0;
while (s[i] != '\0') {
originalLen++;
if (s[i] == ' ') numOfBlank++;
i++;
}
int newLen = originalLen + numOfBlank * 2;
s.resize(newLen); //必须加,如果如offer上的,内存空间固定无法扩展
if (newLen < len) return s;
int p0 = originalLen;
int p1 = newLen;
while (p0 >= 0 && p1 > p0) {
if (s[p0] == ' ') {
s[p1--] = '0';
s[p1--] = '2';
s[p1--] = '%';
}
else
s[p1--] = s[p0];
--p0;
}
return s;
}
②string.replace()
string.replace(i, 1, “%20”) 位置i, 替换字符数,目标字符串
运行时间:3ms 占用内存:408KB
string replaceSpace(string s) {
if (s == "") return s;
int len = s.length();
int i = 0;
while (s[i] != '\0') {
if (s[i] == ' ') s.replace(i, 1, "%20");
i++;
}
return s;
}
奇怪的是,第一名用的是下面这种,他跑2ms,我要8ms
但理论上他应该是慢的,应该是oj的问题
运行时间:8ms 占用内存:384KB
string replaceSpace(string s) {
if (s == "") return s;
for (int i = 0; i < s.length(); i++) {
if (s[i] == ' ')
s.replace(i, 1, "%20");
}
return s;
}
③创建新string(通常思路)
占用内存反而比②少 //捂脸(有oj因素)
运行时间:2ms 占用内存:388KB
string replaceSpace(string s) {
string res = ""; //res:result
int i = 0; //i:index
while (i < s.size()) {
if (s[i] != ' ') {
res += s[i];
}
else {
res += "%20";
}
i++;
}
return res;
}
替换备选
a | b |
---|---|
res += s[i] | res.push_back(s.at(i)) |
res += “%20” | result.append("%20") |