一、问题背景
给定一个字符数组,任务是将其原地反转。也就是说,我们要修改原始数组,而不是创建一个新的数组。
例如,输入的字符数组为:
char[] s = {'h', 'e', 'l', 'l', 'o'};
反转后的结果应该是:
{'o', 'l', 'l', 'e', 'h'};
二、解决方案
反转字符串的经典方法之一是使用“双指针”技术。双指针是指同时使用两个指针,从两端向中间靠拢,逐步交换指针所指向的元素,直到两个指针相遇。具体步骤如下:
- 初始化两个指针:一个指针
left
从字符串的开头开始,另一个指针right
从字符串的结尾开始。 - 交换字符:每次交换
left
和right
指向的字符。 - 移动指针:交换后,
left
向右移动,right
向左移动,直到两个指针相遇或交错。
通过这个过程,我们可以实现原地反转字符串。
三、代码实现
下面是利用双指针实现字符串反转的 Java 代码:
class Solution {public void reverseString(char[] s) {// 初始化左右指针for (int left = 0, right = s.length - 1; left < right; left++, right--) {// 交换指针指向的字符char temp = s[left];s[left] = s[right];s[right] = temp;}}
}
四、代码解析
- 指针初始化:
left
从数组的第一个元素(索引 0)开始,right
从数组的最后一个元素(索引s.length - 1
)开始。 - 循环条件:
left < right
,即只要左指针在右指针的左侧,就继续交换字符。如果左指针与右指针重合或交错,说明字符串已经完全反转,可以退出循环。 - 字符交换:通过一个临时变量
temp
来保存left
指向的字符,然后交换s[left]
和s[right]
。这一过程将不断进行,直到整个数组反转。
五、时间与空间复杂度
- 时间复杂度:O(n),其中 n 是数组的长度。因为我们只遍历了数组一遍,时间复杂度是线性的。
- 空间复杂度:O(1),这个算法的空间复杂度是常数级别的,因为我们只使用了一个额外的变量
temp
来交换字符,而没有使用其他额外的存储空间。