leetcode 344. 反转字符串 [最最最简单的的双指针入门篇] | 刷题打卡

457 阅读1分钟

一、题目描述

leetcode 344 反转字符串

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

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

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例1:

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

示例2: 输入:["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]

二、思路分析

对于前端同学来说这道题根本用不到算法,直接使用字符串的reserve方法就搞定了~

const reverseString = s => s.reverse()

然而想要在算法更进一步的同学一定不要放过这题,这题可以说是leetcode最简单的题目之一了,刚好可以作为双指针算法的入门,让你逐渐找到刷题的快乐。

双指针的思路很简单,定义两个指针分别指向字符串的头部尾部,交换位置,然后两个指针分别相向移动,当指针移动到字符串中心,字符串反转也就完成了~是不是听起来有点道理,来看代码感受一下

for (let i = 0; i < s.length; i++) {
    [s[i], s[s.length - 1 - i]] = [s[s.length - 1 - i], s[i]]
}

三、优化

在算法世界中,很多题目都是先暴力得出结果,然后考虑优化。所以做完算法题然后考虑优化应该像张嘴吃饭一样自然~

考虑当字符串的长度N,当N为奇数,实际循环(N-1)/2次即可完成反转;当N为偶数,实际循环N/2次即可完成反转。这里可以思考下如何最快求出这个遍历次数?


这里直接分享我的做法,使用位移操作符>>,将N向右移1位即可求出最少循环次数

const reverseString = s => {
  for (let i=0;i<(s.length>>1);i++){
    [s[i],s[s.length-1-i]] = [s[s.length-1-i],s[i]]
  }
}

END


本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情