一、题目描述
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 春招闯关活动」, 点击查看 活动详情