版权声明: https://blog.csdn.net/weixin_40550726/article/details/82988031
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。
示例:
输入: s = "abcdefg", k = 2 输出: "bacdfeg"
要求:
- 该字符串只包含小写的英文字母。
- 给定字符串的长度和 k 在[1, 10000]范围内。
思路:len为s字符串的长度,将s字符串按每个字符串长度等于2*k分为n段,如果剩下最后一段字符长度小于2*k,另做处理。将这n段字符串按要求反转(反转前k个字符),剩下的最后一段再进行反转。
class Solution {
public String reverseStr(String s, int k) {
int len=s.length(); //字符串长度
int count=len/(2*k); //每2*k为一段字符串,count是段数
int remainder=len%(2*k);//s字符串中,每2*k为一段字符串,remainder是余下的字符串的长度
char[] chars=s.toCharArray();
//将s字符串中长度为2*k的前count段字符串子串按要求反转
for(int i=0;i<len-remainder;i+=2*k){
reverseCharArrays(chars,i,i+k-1);
}
//反转最后剩余的一段字符串
if(remainder<k){
//长度小于k,全部反转
reverseCharArrays(chars,len-remainder,len-1);
}else{
//长度大于k,反转前k个字符即可
reverseCharArrays(chars,len-remainder,len-remainder+k-1);
}
return new String(chars);
}
/**
* 反转从startIndex到endIndex这一段字符数组
* @param chars
* @param startIndex
* @param endIndex
*/
public void reverseCharArrays(char[] chars,int startIndex,int endIndex){
while(startIndex<endIndex){
char tmp=chars[endIndex];
chars[endIndex]=chars[startIndex];
chars[startIndex]=tmp;
startIndex++;
endIndex--;
}
}
}