携手创作,共同成长!这是我参加「掘金日新计划 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)