leetcode【字符串—简单】541.反转字符串 II

文章目录

前言

哈喽,我是长路,目前刚刚大三,方向是后端也偶尔捣鼓下前端,现在的主语言是Java。之前一大段时间都是在学习web开发的一些技术,就很久没有进行类似于数据结构、算法之类的学习与刷题,打算这段时间拾起来好好学一学、搞一搞。

这段时间也是机缘巧合看到草帽路飞的博客,加了自学群,正巧看到博主组织在群里组织了leetcode刷题打卡活动,我也就参与进来,为期一个月,打算坚持每天都花一些时间做一些题目,并通过博客的方式来进行记录。

目前跟着一个Github仓库刷题(leetcode):代码随想录leetcode刷题,当前为字符串专题。



题目

题目来源leetcode

leetcode地址:541. 反转字符串 II,难度:简单。

题目描述(摘自leetcode):

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
 
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
    
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"

提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104

本地调试代码:

class Solution {
    public String reverseStr(String s, int k) {
        ...
    }

    public static void main(String[] args) {
        System.out.println(new Solution().reverseStr("abcdefg", 2));
    }

}


题解

思路:每次移动2*k,若是移动的位置在当前字符数组范围内对前k个进行反转,这是个循环过程。若是不在范围内,就要额外来处理两种情况。①剩余字符少于k个,剩余字符全部反转。②大于等于k个,小于2k个就反转前k个字符。详细可见代码

代码

public String reverseStr(String s, int k) {
    int curPos = 2 * k;
    char[] chars = s.toCharArray();
    //每次循环2*k个字符
    while (curPos <= s.length()) {
        reverse(chars, curPos - 2 * k, curPos - k - 1);
        curPos += 2 * k;
    }
    //判断是否有剩余字符
    if ((curPos - 2 * k) <= s.length()) {
        //剩余>=k <2*k情况,反转前面k个
        if (curPos - k <= s.length()) {
            reverse(chars, curPos - 2 * k, curPos - k - 1);
        } else {
            //反转剩余的全部
            reverse(chars, curPos - 2 * k, s.length() - 1);
        }

    }
    return new String(chars);
}

//反转字符串
public void reverse(char[] chars, int left, int right) {
    while (left < right) {
        chars[left] ^= chars[right];
        chars[right] ^= chars[left];
        chars[left++] ^= chars[right--];
    }
}

leetcode【字符串—简单】541.反转字符串 II



参考文章

[1]. leetcode题解

[2]. 代码随想录—541. 反转字符串II



我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接

上一篇:python关于字符串


下一篇:字符串长度