Java 中原地反转字符串

17 Mar 2025 | 4 分钟阅读

虽然字符串在使用过程中,仍然可以进行反转。由于 Java 中的 String 是不可变的,因此无法反转同一个字符串;但是,通过使用可变的 StringBuilder 或 StringBuffer,您可以限制中间字符串对象的数量。我们之前用于原地反转数组的方法与我们将用于原地反转字符串的方法相同。您必须从字符串的一端移动到另一端,同时交换两端的字符,才能到达字符串的中间。此时,字符串中的字符将被反转。为了实现字符交换,此方法只需要额外的少量内存来存储一个字符。

Reverse a String in Place in Java

该算法的时间复杂度为 O(n/2),当我说是 O(n) 时,n 实际上是字符串的长度。

每当您需要在应用程序中反转字符串时,都应使用 StringBuilder 的 reverse() 方法。此函数会反转字符串原地字符的顺序。此外,它还能正确处理代理对。如果序列中存在任何代理对,反转操作会将它们视为单个字符。

因此,高低代理的顺序永远不会改变。请注意,反转操作可能会生成以前未与低代理和高代理配对的代理对。例如,反转 "uDC00uD800" 会得到 "uD800uDC00",这是一个有效的代理对。

原地反转字符串的 Java 程序示例

下面是一个示例 Java 程序,它解决了原地反转字符串的问题,除了用于跟踪位置的一两个变量外,无需额外内存。在此示例中,我们使用迭代方法来反转字符串。

它首先将字符串转换为 StringBuilder,以便无需创建临时字符串对象即可对其进行修改。然后,它会遍历 StringBuilder 并交换两端的字符,直到到达中间。此时,字符串将被反转,而无需使用任何额外的 RAM。

这是关于字符串编码的一个热门话题,在 Java 和其他语言的编程工作面试中经常被问到。

这是关于字符串编码的一个热门话题,在 Java 和其他语言的编程工作面试中经常被问到。要做好 Java 面试的准备,一种最好的方法是通过这些编码面试课程中提供的挑战来练习。

此图显示了原地反转字符串的逻辑,您可以观察到在我们的循环的每次迭代中字符是如何被交换的。

现在让我们来观察程序的运行情况。

文件名: StringReplacing.java

输出

The original String is : 149
Reversed String is : 941

如您所见,我们只是在 StringBuilder 中交换字符,而不是创建新的 String 实例。使用此算法时,Java 程序员通常会遍历整个字符串,而不是在某个特定点暂停。

错误与我们在原地反转 ArrayList 时讨论过的错误相同。在对字符串进行完整遍历时,将每个字符交换两次会导致它们返回到初始位置,从而使字符串保持不变。

使用 Java 反转字符串所需的全部代码如上所示。相同的算法也可以在 Java 中用于反转任何数组,包括字符串数组和整数数组。在 Java 中,字符串也由字符数组支持。作为额外的练习,您可以尝试使用 Java 非递归地反转任何单向链表。虽然有点困难,但如果您运用逻辑,是可以实现的。