O(1)反向串 这是C++中字符串反转的最好方法吗?

O(1)反向串 这是C++中字符串反转的最好方法吗?,c++,string,recursion,C++,String,Recursion,void reverseString(string &str) { int begin = 0; int end = str.length() - 1; while (begin < end) swap(str[begin++], str[end--]); } void reverseString(字符串和字符串){ int begin=0; int end=str.length()-1; while(开始

void reverseString(string &str) {

int begin = 0;
int end = str.length() - 1;

while (begin < end)
    swap(str[begin++], str[end--]);
}
void reverseString(字符串和字符串){
int begin=0;
int end=str.length()-1;
while(开始<结束)
交换(str[begin++],str[end--]);
}

有更好的方法使用递归吗

您不必重新发明轮子,有一些高效的算法可以轻松使用,而无需重新创建它们

正如其他人所说,反转字符串或任何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'; 
}
#包括
#包括
#包括
int main()
{ 
std::字符串foo(“foo”);
std::字符串副本(foo);

std::cout您不必重新发明轮子,有一些高效的算法可以轻松使用,而无需重新创建它们

正如其他人所说,反转字符串或任何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'; 
}
#包括
#包括
#包括
int main()
{ 
std::字符串foo(“foo”);
std::字符串副本(foo);

std::cout根据定义,字符串是任意长度的,这使得任何访问其元素的算法的最小长度都是O(N)

所以O(1)是不可能的

你的O(N)方法是你能得到的最好的方法(
std::reverse
做的和你得到的完全一样)…递归不会有帮助(事实上只会让事情变得更糟)


不相关的注意:您的代码有几个潜在的bug:

int end = str.length() - 1;
  • str.length()
    0
    (在C++20之前未定义的行为)时将溢出
  • str.length()
    大于2 GB时,
    int
    将溢出

  • 根据定义,字符串是任意长度的,这使得任何访问其元素的算法的最小值都是O(N)

    所以O(1)是不可能的

    你的O(N)方法是你能得到的最好的方法(
    std::reverse
    做的和你得到的完全一样)…递归不会有帮助(事实上只会让事情变得更糟)


    不相关的注意:您的代码有几个潜在的bug:

    int end = str.length() - 1;
    
  • str.length()
    0
    (在C++20之前未定义的行为)时将溢出
  • str.length()
    大于2 GB时,
    int
    将溢出

  • ?如果使用反向迭代器访问字符串,则有…O(0)?如果将字符串包装到一个类中,该类根据内部标志自动使用正向或反向迭代,则反向将减少为更改标志。这将是O(1)。如果必须在内存中反转字符串,那么这种可能性如何为O(1)?您需要访问所有n个元素。好的,所以我很好奇,如果我在面试中被要求编写一个反转字符串的函数,上面的答案会被认为是可接受的/好的还是坏的?抱歉,现在是凌晨3点,我几乎无法思考。请注意,此算法可能不适用于空字符串。函数长度返回一个无符号整数。如果为空,则为0-1 g为您提供一个巨大的正整数。如果该值大于int的最大值,则将其强制转换为int是未定义的行为(意味着程序可能会崩溃,给出错误的结果或预期的结果)。?如果使用反向迭代器访问字符串,则有…O(0)?如果您将字符串包装到一个类中,该类根据内部标志自动使用正向或反向迭代,反向将减少为更改标志。这将是O(1)。如果您必须在内存中反转字符串,那么这种可能性怎么可能是O(1)?您需要访问所有n个元素。好的,所以我很好奇,如果我在面试中被要求编写一个反转字符串的函数,上面的答案会被认为是可接受的/好的还是坏的?抱歉,现在是凌晨3点,我几乎无法思考。请注意,此算法可能不适用于空字符串。函数长度返回一个无符号整数。如果为空,则为0-1 g为您提供一个巨大的正整数。如果该值大于int的最大值,则将其强制转换为int是未定义的行为(意味着程序可能会崩溃、给出错误结果或预期结果)。请查看cppreference.com上可能的实现。我怀疑std库是否比OP的方法更有效(除非它能获得任何特定于平台的硬件“魔术”)。如果你考虑单个字符写操作,这是O(n)。当OP似乎在寻求最佳的复杂度/性能时,你也可以通过反向迭代器来提及遍历字符串。做某事最好的方法是根本不做它。看看cppreference.com上可能的实现。我怀疑std库比OP的方法更有效(除非它能获得任何特定于平台的硬件“魔力”)。IMHO,这是O(n)如果你考虑单独的字符写操作。当OP似乎在寻求最佳的复杂度/性能时,你也可以通过反向迭代器来提及遍历字符串。做某事最好的方法是根本不做。