关于算法:如何在O(1)复杂度(运行时)中反转字符串?

How to reverse a string in O(1) complexity (runtime)?

今天我接受了一次面试,要求我在一次手术中扭转局面。我觉得不到O(N)是不可能的。顺便说一下,我得到了一个线索,"交换"!所以。…有答案吗?

  • 示例输入:"abcdefghi"(或任何字符串)
  • 样本输出:"IHGFEDCBA"
  • 不能使用内置函数。(例如:strrev())
  • 答案并不像打印/迭代那样复杂。


O(N)时间中不能反转字符串,但是,可以使用O(1)空间复杂性来反转字符串。

reverse a string in single operation

很可能是reverse it in one-liner,因为还不清楚"操作"到底是什么。

可以使用STD::反向算法在一行中反转字符串:

1
2
3
4
5
6
7
8
9
#include <string>
#include

int main()
{
    std::string str ="Hello world!";
    std::reverse(str.begin(), str.end());
    std::cout <<"reverse is: "" << str << '"' << std::endl;
}

输出:

1
reverse is:"!dlrow olleH"

或者你也可以用一个简单的循环来完成它:

1
2
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)中反转一个序列。


你做不到。即使在某个地方有一些现有的函数可以实现它,但在内部它仍然需要O(N)。虽然从技术上讲,交换的复杂性是偶数个字符的O(n)和奇数个字符的O(n-1)(因此可以"从技术上"说交换3个字符的字符串是O(1)),但每个操作都有点复杂,因为在交换另一个字符时,必须将一个交换字符存储在局部变量中。因此,出于实际原因,交换将更慢,而不是更快。


把绳子倒过来?只需将它从rbegin()迭代到rend()。或者std::copy的范围是一个新的字符串。一个"颠倒的字符串"和原来的字符串一样,只是读另一种方式。