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似乎在寻求最佳的复杂度/性能时,你也可以通过反向迭代器来提及遍历字符串。做某事最好的方法是根本不做。