LeetCode(JS) 344.反转字符串|541. 反转字符串II|剑指Offer 05.替换空格|151.翻转字符串里的单词|182. 动态口令 代码随想录 - 字符串day8

一、344反转字符串

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

第一想法:

看到题第一反应,reverse!哐哐一行搞定☺️嘿嘿

解题思路:

- 还可以用析构函数再循环里前后交换数据

- 用双指针,一个从字符串前面,一个从字符串后面,同时向中间移动交换元素

提交代码:

 s.reverse()
    // 析构函数
    for(let i=0,j=s.length-1;i<j;i++,j--){
        //用ES6析构函数交换两个数的位置
        [s[i],s[j]]=[s[j],s[i]]
    }
   //双指针
    let left = 0, right = s.length -1
    while(left<right){
        let r = s[right]
        s[right] = s[left]
        s[left] = r
        left++;
        right--
    }

​​​​​​​

二、541反转字符串II

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

第一想法:

循环每次i移动2k,在循环体内反转前k个字符,分割出来的字符可能小于k,也可能在k和2k之间,要怎么划分出来???

解题思路:

  1. for循环遍历,用i+=2*k让下标位置每次移动2k,再判断是否有需要反转的区间
  2. 左边界为i,右边界判断一下i+k-1是否超出了整个长度,如果超出了,那说明最长就是最后一位数,没有超出那就取i到i+k-1的这些字符进行反转
  3. 然后就是交换字符串的逻辑,随便咋写都行👍🏻

提交代码:

var reverseStr = function(s, k) {
    let newS = s.split("")
    for(let i = 0;i < s.length; i+=2*k){
        let left = i, right = (i+k-1)>=newS.length?newS.length-1:i+k-1
         //判断剩余字符,确认有边界下标
        while(left<right){
            [newS[left],newS[right]]=[newS[right],newS[left]]
            left++,right--
        }
    }
    return newS.join('')
};

三、剑指Offer 05.替换空格

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

第一想法:

这这这,直接用replaceAll,把所有的.替换成空格,一行搞定🤝

提交代码:

//用replace
var pathEncryption = function(path) {
    return  path.replaceAll('.',' ');
};

四、151.翻转字符串里的单词

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

第一想法:

只是进行了顺序交换,但是是整体的单词进行位置交换不是字符。或许可以统计有多少个单词(空格),以此判断两两交换的位置?啊啊啊不行,因为有空格+字母的形式,也有字母+空格的形式,而且空格可以连续有好几个,,,,,

或许可以把字符串整体翻转,然后再在内部进行小的翻转!

解题思路:

难点⚠️在于去除多个空格,因为空格可能出现在前中后任意位置,且数量不定

  1. 首先把字符串变成数组然后整体进行反转
  2. 然后使用快慢指针,去掉数组中不必要的空格,只保留字母之间的空格
  3. 最后翻转单词内部,重写reverse,每当遇到空格时,记录下单词的下标长度,调用reverse翻转当前单词

提交代码:

var reverseWords = function(s) {
    let res = Array.from(s).reverse()
    //先进行字符串整体翻转
    //去除空格
    let slow=0 
    for(let fast = 0;fast<res.length;fast++){
        //如果快指针指向的是字符
        if(res[fast]!=' '){
        //慢指针只有指向第一个的时候不留出空格
            if(slow!=0){
                res[slow++]=' '
            }
            while (fast < res.length && res[fast]!=' ') { //补上该单词,遇到空格说明单词结束。
                res[slow++] = res[fast++];
            }
        }
    }
    let newR = res.splice(0,slow)
    
    let start = 0
    //翻转内部字符
    for(let j=0;j<=newR.length;j++){
        if(newR[j] == ' '|| j==newR.length){
            //重写reverse的方法
            reverse(newR,start,j-1)
            start = j+1
        }
    }

    return newR.join('')
    //翻转字符
    function reverse(arr, start, end){
        let left = start,right = end
        while(left<right){
            [arr[left], arr[right]] = [arr[right], arr[left]]
            left++;
            right--;
        }
        return arr
    }
};

五、182 动态口令

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

第一想法:

拼接字符串,把前target个字符串提取出来,从后拼接到原字符串上

解题思路:

如果不能额外开辟空间。可以模仿上一题,使用整体翻转+局部翻转的方式。先反转区间为前n的子串,然后反转区间为n到末尾的子串,最后反转整个字符串.

提交代码:

//1.0
var dynamicPassword = function(password, target) {
    let newp = password.split('')
    let newcut = newp.splice(0,target)
    return newp.concat(newcut).join('')
};
//2.0
var dynamicPassword = function(password, target) {
    let res = password.split('')
    reverse(res,0,target-1)
    reverse(res,target,res.length-1)
    reverse(res,0,res.length-1)

    function reverse(arr,start,end){
        while(start<end){
            [arr[start],arr[end]]=[arr[end],arr[start]]
            start++
            end--
        }
        return arr
    }

    return res.join('')
};

题解资料:代码随想录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值