QUESTION:
Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original.
Example:
Input: s = "abcdefg", k = 2
Output: "bacdfeg"
Restrictions:
+The string consists of lower English letters only.
+Length of the given string and k will in the range [1, 10000]
EXPLANATION:
1.每次前进k步,通过flag判断这个k步是否需要翻转
2.需要翻转的进行翻转操作,不需要的直接continue
3.注意判断最后的边界情况
SOLUTION:
public class Solution {
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
boolean shouldReverse = false;
for(int i = 0;i<chars.length;i+=k){
shouldReverse = !shouldReverse;
if(!shouldReverse)continue;
reverseHelper(chars,i,i+k-1);
}
return new String(chars);
}
public void reverseHelper(char[] chars,int a,int b){
if(b>chars.length-1) b = chars.length-1;
while (a<b){
switchIndex(chars,a,b);
a++;b--;
}
}
public void switchIndex(char[] chars,int a,int b){
char tmp = chars[a];
chars[a] = chars[b];
chars[b] = tmp;
}
}
public static string ReverseStr(string s, int k) {
Char[] chars = s.ToCharArray();
bool shouldReverse = false;
for (int i = 0; i < chars.Length; i += k) {
shouldReverse = !shouldReverse;
if (!shouldReverse)
continue;
ReverseStrHelper (chars, i, i + k - 1);
}
return new string (chars);
}
public static void ReverseStrHelper(Char[] chars,int a,int b){
if(b>chars.Length-1) b = chars.Length-1;
while (a < b) {
Switch (chars, a, b);
a++;b--;
}
}
public static void Switch(Char[] chars,int a,int b){
Char tmp = chars[a];
chars [a] = chars [b];
chars [b] = tmp;
}