344. 反转字符串
-
leetcode: 344. 反转字符串
-
灵神:题解
核心思路
设 \(s\) 长度为 \(n\)。反转可以看成是交换 \(s[0]\) 和 \(s[n-1]\),交换 \(s[1]\) 和 \(s[n-2]\),交换 \(s[2]\) 和 \(s[n-3]\),依此类推。
双指针写法
初始化两个指针 \(left=0\) 和 \(right=n-1\) 表示需要交换的位置。每次交换后,将指针向中间移动,\(left\) 加一,\(right\) 减一。
什么时候退出循环呢?
- 如果 \(n\) 是奇数,最终 \(left = right = \left\lfloor \frac{n}{2} \right\rfloor\),无需交换。
- 如果 \(n\) 是偶数,最后交换的是 \(left = \frac{n}{2} - 1\) 以及 \(right = \frac{n}{2}\),然后各移动一位变成 \(left = \frac{n}{2}\),\(right = \frac{n}{2} - 1\),退出循环。
综上所述,当 \(left \ge right\) 时,所有字符交换完毕,退出循环。
class Solution {
public void reverseString(char[] s) {
int n = s.length;
for (int left = 0, right = n - 1; left < right; left++, right--) {
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
}
}
}

浙公网安备 33010602011771号