持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
344.反转字符串
分析题目
题目要求将输入的字符串反转过来。输入输出字符串都是字符数组。并且要求不能另外开辟空间,必须原地修改输入数组。
JS有反转的库函数,但是为了深入理解字符串反转的实现原理,这里不使用库函数。
解题
前面在链表专题的时候做过反转链表这道题。其实数组的反转要比链表更简单一些。
同样使用双指针的方法定义左右两个指针,一个在字符串前面,一个在字符串后面。两个指针同时向中间移动交换元素,就可以实现字符串的反转
代码如下:
var reverseString = function(s) {
let l = -1, r = s.length;
while(++l < --r) [s[l], s[r]] = [s[r], s[l]];
};
[s[l], s[r]] = [s[r], s[l]]可以实现交换。
541. 反转字符串II
分析题目
这道题跟上道题的要求相似,只不过需要间隔2K个字符反转前K个字符,这样给这道题增加了难度。
解题
题目要求间隔2K个字符,在前K个字符做反转字符串的操作。我们可以将每2K个字符看作一个区间、,来操作他前K个字符串。
也就是在最外层套一个for循环,用来每次移动2K个距离,再判断一下右侧指针的位置就可以了。
代码如下:
var reverseStr = function(s, k) {
let len = s.length
let resArr = s.split("")
for(let i = 0;i < len;i += 2 * k) {
let l = i - 1,r = i + k > len ? len : i + k
while(++l < --r) [resArr[l], resArr[r]] = [resArr[r], resArr[l]]
}
return resArr.join("")
};
值得注意的是这道题与上道题不同,这道题输入输出数据是一个字符串,并不是一个字符数组。需要我们来进行变换。通过s.split("")将字符串转换为字符数组,再通过resArr.join("")将字符数组转换回字符串。