LeetCode541-反转字符串II | 算法练习系列

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

前言

js每日算法题,今天来一道字符串相关的题目,其实感觉像是数组处理的题目,不知道是不是我的理解有问题,下面来看看题目

题目描述

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。  

示例 1:

输入:s = "abcdefg", k = 2

输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2

输出:"bacd"

解题思路

  • 之前写过一个比较简单的字符串反转,那道题是反转的是整个字符串,这道进阶的题目反转的是一个字符串中特定的一些字符串
  • 首先看到这个字符串我就把把它切割了放在数组中,这样便于接下来的操作,由于题目中说的是每计数2k个字符,反转其中的前k个字符,那么我们就要先计算出整个字符串一共要进行多少次反转
  • 计算出一共需要多少次反转后,通过for循环进行每一次的反转,声明两个指针,分别是left和right,这里要非常注意,left和right的初始位置要跟随for循环中的i来变化
  • 还要注意的一点是一共需要的反转次数是s.length / (2 * k),要记得向上取整,当循环结束把数组再转换成字符串就得到了我们需要的结果,下面看代码
/**
 * @param {string} s
 * @param {number} k
 * @return {string}
 */
var reverseStr = function (s, k) {
    let b = s.split('') 
    let x = Math.ceil(s.length / (2 * k))//这里求出一共需要反转几次
    let left = 0
    let right = k - 1
    let curr = null
    for (let i = 0; i < x; i++) {
        curr = null
        left = i * 2 * k //每次循环开始重置left和right的起始位置
        right = (k - 1) + i * 2 * k
        while (left < right) {
            curr = b[left]
            b[left] = b[right]
            b[right] = curr
            left++
            right--
        }
    }
    return b.join('') //输出的时候接的把数组再转换会字符串

};
复制代码

总结

这道题目也是一道很简单的算法题,其中比较核心的就是要先把字符串转数组,然后要看出到底要进行几次反转,其次是每次反转如何进行,要定位好每次进行反转的字符串的其实位置,最后把反转之后的数组转字符串就行了,继续加油,gogogo

猜你喜欢

转载自juejin.im/post/7032604671126536229
今日推荐