代码随想录算法训练营第七天 | 344.反转字符串、541. 反转字符串II、剑指Offer 05.替换空格

106 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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("")将字符数组转换回字符串。