1. 示例:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
2. 思路
- 设置两个指针,左指针
l
执行数组第一个元素,右指针r
指向数组最后一个元素 - 遍历数组,两个指针分别往数组中间移动
- 如果左指针
l
和右指针r
所指向的数组元素不相等则交换;相等则不交换。 - 左指针
l
往前一步,右指针r
往后一步,即两指针往中间移动
3. 代码
// 双指针法
public void reverseString(char[] s) {
// base case
if (s.length == 0) return;
// 左指针l,指向数组第一个元素
int l = 0;
// 右指针r,指向数组最后一个元素
int r = s.length - 1;
// 暂存变量
// char temp;
// 遍历数组,遍历到数组中间位置时结束
// 两个指针往中间移动
while (l < r) {
// 如果左指针l和右指针r所指向的数组元素不相等,则交换
// 因为相等所以不用交换了,节省时间
if (s[l] != s[r]) {
// 交换方式一
// temp = s[l];
// s[l] = s[r];
// s[r] = temp;
// 交换方式二
s[l] ^= s[r];
s[r] ^= s[l];
s[l] ^= s[r];
}
// 如果左指针l和右指针r所指向的数组元素相等,则继续下一次遍历,
// 左指针l加一,往前一步
l++;
// 右指针减一,往后一步
r--;
}
}