leetcode-数组-344-反转字符串

112 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

Hi, 大家好。我是新人,程序员库里。

今后会按类分享算法题。

今天给大家分享第10道leetcode上数组中使用双指针相关的算法题。

344.反转字符串

leetcode地址:leetcode-cn.com/problems/re…

难度

简单

描述

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

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

 

提示:

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

示例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. 采用指针对撞的方法
  2. 定义左指针left,初始值是0
  3. 定义右指针right,初始值指向数组最后一个元素
  4. 开始while循环,条件是当left小于right的时候
  5. 将左指针指向的元素和右指针指向的元素进行交换
  6. 接着将左指针向右移动一位,将右指针向左移动一位,接着交换位置
  7. 最后返回数组

解法二

第一种解法其实是数组api,调用reverse,不过这样就没有啥解题的意义了,毕竟不是工作中倒序

解法三

第二种解法也是我提交的解法,感觉更好理解 思路:1.先倒着循环一圈,依次push,这样出来的结果一个镜像过的数组 2.然后从零删除掉之前的长度,剩下就是要的数组了

下面采用解法一:

代码

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