我今天接受了采访,并被要求在单一操作中反转一个字符串。我觉得这不可能在 O(n)之内。顺便说一句,我得到了一个线索,“交换”!所以。 。 。有没有答案?
strrev()
)答案 0 :(得分:1)
您无法在O(N)
时间内撤消字符串,但是,您可以使用O(1)
空间复杂度来执行此操作。
在单个操作中反转字符串
最有可能的是reverse it in one-liner
,因为它甚至不清楚什么是"操作"真的是。
您可以使用std::reverse算法reverse a string in one line:
#include <string>
#include <algorithm>
int main()
{
std::string str = "Hello world!";
std::reverse(str.begin(), str.end());
std::cout << "reverse is: \"" << str << '\"' << std::endl;
}
输出:
reverse is: "!dlrow olleH"
或者您也可以使用一个简单的循环来完成它:
for (size_t i=0; i<str.size()/2; ++i)
std::swap(str[i], str[str.size()-1-i);
然而,这是O(N)
运行时和O(1)
空格(就像std::reverse
)。
通常采访简单的反向字符串算法问题并不是关于某些技巧,很可能你的采访者想要看到这种循环的实现。此外,不要忘记面试官也是人类,有时他们只会犯错误并要求不可能。或者,他们只是想让你说不可能在O(1)
中反转序列。
答案 1 :(得分:0)
反转一个字符串?只需将其从rbegin()重复到rend()
即可。或std::copy
范围为新字符串。
“反向字符串”与原始字符串相同,只是另读。
答案 2 :(得分:0)
你不能这样做。即使在某个地方有一些现有的功能,它内部仍然需要O(n)。虽然从技术上讲,交换的复杂性对于偶数个字符是O(n)而对于奇数个字符是O(n-1)(因此可以“技术上”说交换3个字符的字符串是O(1) )),每个操作都有点复杂,因为你必须在交换另一个时将一个交换的字符存储在局部变量中。因此,出于实际原因,交换会更慢,而不是更快。