携手创作,共同成长!这是我参加「掘金日新计划 8 月更文应战」的第20天,点击查看活动详情

一、标题描绘:

541. 回转字符串 II – 力扣(LeetCode) (leetcode-cn.com)

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

假如剩下字符少于 k 个,则将剩下字符悉数回转。
假如剩下字符小于 2k 但大于或等于 k 个,则回转前 k 个字符,其他字符保持原样。

示例 1:

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

示例 2:

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

提示:

1 <= s.length <= 10^4
s 仅由小写英文组成
1 <= k <= 10^4

二、思路分析:

首先字符回转可直接调用StringBuilder(str).reverse()
咱们将字符串看成一段段2k子串 标记开始方位 每次遍历satrt+=2*k 超过len结束
界说firstK和secondK记录等一个k和第二个k的方位 超过len就标记为len
因为少于k个悉数翻转,大于k个翻转前k个那么在前k方位的子串一定会回转 (start,firstK)
用StringBuffer.append把回转后的字符串
要进行末尾情况判别,假如firstK<secondK那么firstK,secondK之间字符串加入成果串
此外则说明start+k>len 末尾段翻转后加入成果串结束即可

三、AC 代码:

class Solution {
    public String reverseStr(String s, int k) {
        int len=s.length();
        if(len<k)
            return rever(s);
        StringBuffer res = new StringBuffer();
        int start = 0;
        while(start<len){
            int firstK=(start+k>len)?len:start+k;  //超过则直接定为len
            int secondK = (start+2*k>len)?len:start+2*k;
            //前k个方位一定会回转
            res.append(rever(s.substring(start,firstK)));//加入前k
            if(firstK<secondK) //剩下长度大于k
                res.append(s.substring(firstK,secondK));//加入后k
            start+=2*k;
        }
        return res.toString();
    }
    public String rever(String str){//回转字符串
        return new StringBuilder(str).reverse().toString();
        //或者存入字符数组从后加至新字符串
    }
}

范文参阅:

好好看下代码和详解,这道题很共同 – 回转字符串 II – 力扣(LeetCode)