一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
Hi, 大家好。我是新人,程序员库里。
今后会按类分享算法题。
今天给大家分享第10道leetcode上数组中使用双指针相关的算法题。
344.反转字符串
leetcode地址:leetcode-cn.com/problems/re…
难度
简单
描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
提示:
1 <= s.length <= 105s[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"]
解法一
- 采用指针对撞的方法
- 定义左指针left,初始值是0
- 定义右指针right,初始值指向数组最后一个元素
- 开始while循环,条件是当left小于right的时候
- 将左指针指向的元素和右指针指向的元素进行交换
- 接着将左指针向右移动一位,将右指针向左移动一位,接着交换位置
- 最后返回数组
解法二
第一种解法其实是数组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;
};