难以理解部分代码;我得到的输出也是错误的。问题是用'%20'替换字符串中的所有空格。完整的代码如下所示;它可以编译,但运行不完全正确。
#include <iostream>
#include <string>
using namespace std;
void replaceSpaces(string str){
//Getting the length of the string, counting the number of spaces
int strLen = str.length();
int i, count = 0;
for (i = 0; i <= strLen; i++) {
if(str[i]==' ')
count++;
}
//Determining the new length needed to allocate for replacement characters '%20'
int newLength = strLen + count * 2;
str[newLength] = '\0';
for (i = strLen - 1; i >= 0; i--) {
if (str[i] == ' ') {
str[newLength - 1] = '0';
str[newLength - 2] = '2';
str[newLength - 3] = '%';
newLength = newLength - 3;
}
else {
str[newLength - 1] = str[i];
newLength = newLength -1;
}
}
cout << str <<endl;
}
int main() {
string str = "hello jellybean hello";
replaceSpaces(str);
return 0;
}
我可能缺少一些明显的东西,但是在此行中分配新的字符串长度时:
int newLength = strLen + count * 2;
在这里,我们将空格数乘以2,但是如果我们尝试用'%20'替换所有空格,为什么不将其乘以3?
str[newLength] = '\0';
此行是否表示已将字符串中最后一个字符之后的位置分配为空空格?
我也对
else
语句感到困惑。 else {
str[newLength - 1] = str[i];
newLength = newLength -1;
}
不知道在执行此操作时我是否完全了解这种情况。
在编译和运行函数时,如果
string str = "hello jellybean hello";
预期的输出将是hello%20jellybean%20hello,但我得到的输出是hello%20jellybean%20h。
就时间复杂度而言,由于有两个独立的
for
循环,时间复杂度是否为O(n)?我知道我要问很多不同的问题,在此先感谢您的任何回答!
最佳答案
这是错误的:
str[newLength] = '\0';
std::string
对象根据其大小在内部维护其NUL终止符。你要str.resize(newLength);
代替。
关于c++ - 用'%20'(C++)替换字符串中的所有空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38362837/