344. 反转字符串

116 阅读1分钟

题目

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。

 

示例 1:

输入: s = ["h","e","l","l","o"]
输出: ["o","l","l","e","h"]

示例 2:

输入: s = ["H","a","n","n","a","h"]
输出: ["h","a","n","n","a","H"]

 

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

题解

本题可以使用双指针解法

对于长度为 N的字符串, 反转前的字符串中的字符为s[0]s[1]....s[n-1], 反转后的字符串中的字符为s[n-1]s[n-2]...s[0], 比较反转前后的下标很容易出s[i]的字符与s[n-1-i]的字符发生了交换的规律,比较反转前后下标很容易得出s[i]的字符与s[n-1-i]发生了交换。因此双指针的解法如下:

-`left`指针指向`s[0]`, `right`指向`s[n-1]`
-`left < right`
    - 交换`s[left]``s[right]`
    - `left`指针右移一位, `left = left + 1`
    - `right`指针左移一位,`right = right + 1`
-`left >= right`, 反转结束,返回字符串`s`即可。

代码

/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
    for (let left = 0, right = s.length - 1; left < right; left++, right--) {
        [s[right], s[left]] = [s[left], s[right]]
    }
};

原题链接

344. 反转字符串