这是在c ++中反转字符串的最佳方法吗?
void reverseString(string &str) {
int begin = 0;
int end = str.length() - 1;
while (begin < end)
swap(str[begin++], str[end--]);
}
是否有使用递归的更好方法?
答案 0 :(得分:1)
您不必重新发明轮子,有一些有效的算法可以轻松使用而无需重新创建它们。
正如其他人所说,反转字符串或实际上任何STL容器std::reverse()
都是最佳选择。
#include <algorithm>
#include <iostream>
#include <string>
int main()
{
std::string foo("foo");
std::string copy(foo);
std::cout << foo << '\n' << copy << '\n';
std::reverse(copy.begin(), copy.end());
std::cout << foo << '\n' << copy << '\n';
}
此外,您可能希望像上面的示例一样使用字符串的副本,因为已经进行了std::reverse()
动作。
答案 1 :(得分:1)
根据定义,字符串的长度是任意的,这使得任何访问其元素O( N )的算法最少。
所以O( 1 )是不可能的。
您的O( N )方法是您可以获得的最好方法(std::reverse
与您拥有的方法完全一样)。递归将无济于事(实际上只会使情况更糟)。
不相关的说明:您的代码有两个潜在的错误:
int end = str.length() - 1;
str.length()
为0
时将溢出(直到C ++ 20才出现未定义的行为)int
大于2 GB时,str.length()
将溢出