原题信息
原题地址:541. 反转字符串 II
我的题解: java 遍历 分类处理 注释详细 逻辑执行效率高
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
解析思路
排除不需要交换的情况看k<2&&length<k
//排除特殊不需要反转的情况
if(k<2&&length<k){
return s;
}
计算需要字符串需要反转的次数div和剩余字符mod
//剩余字符数量
int mod = length%(2*k);
//统计k的数量
nt div = length/(2*k);
反转这 2k 字符中的前 k 个字符。
for (int i = 0; i < div; i++) {
//反转这 2k 字符中的前 k 个字符。
reverseString(chars,i*2*k,k);
}
处理剩余字符,两种情况mod>=k和mod<k分别处理。
if (mod>=k){//剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
reverseString(chars,div*2*k,k);
}else {//剩余字符少于 k 个,则将剩余字符全部反转
reverseString(chars,div*2*k,mod);
}
反转函数
//反转index开始后k个字符串
public void reverseString(char[] s,int index,int k) {
//只需遍历k/2,就可以完成k个字符串的反转
for (int i = 0; i < k/2; i++) {
char temp = s[i+index];
s[i+index] = s[index+k-i-1];
s[index+k-i-1] = temp;
}
}
Code
public String reverseStr(String s, int k) {
final int length = s.length();
//排除特殊不需要反转的情况
if(k<2&&length<k){
return s;
}
final char[] chars = s.toCharArray();
//剩余字符数量
int mod = length%(2*k);
//统计k的数量
int div = length/(2*k);
for (int i = 0; i < div; i++) {
//反转这 2k 字符中的前 k 个字符。
reverseString(chars,i*2*k,k);
}
if (mod>=k){//剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
reverseString(chars,div*2*k,k);
}else {//剩余字符少于 k 个,则将剩余字符全部反转
reverseString(chars,div*2*k,mod);
}
return new String(chars);
}
//反转index开始后k个字符串
public void reverseString(char[] s,int index,int k) {
//只需遍历k/2,就可以完成k个字符串的反转
for (int i = 0; i < k/2; i++) {
char temp = s[i+index];
s[i+index] = s[index+k-i-1];
s[index+k-i-1] = temp;
}
}