给定一个字符串 s
和一个整数 k
,从字符串开头算起,每 2k
个字符反转前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
提示:
1 <= s.length <= 104
s
仅由小写英文组成1 <= k <= 104
Related Topics
题解
8月20日每日一题,简单
转换成char数组,然后从下标0开始,往后k个,一次分段内翻转,一次调过不动作,如此循环。
最后一个循环如果需要翻转,且往后k个位置数组越界了,则取数组最后下标
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String reverseStr(String s, int k) {
k--;
char[] chars = s.toCharArray();
boolean ifSkip = false;
for (int i = 0; i < s.length(); i += k+1) {
if (ifSkip){
ifSkip = false;
}else{
ifSkip = true;
reverseSubStr(chars,i, Math.min(i + k, chars.length - 1));
}
}
return new String(chars);
}
public void reverseSubStr(char[] s,int left, int right){
char tmp;
while (left < right){
tmp = s[left];
s[left++] = s[right];
s[right--] = tmp;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
为啥我一开始要k–呢,因为下面每次遍历子分段边界的问题。
另外每次for循环的时候会差一个,所以额外需要再加1。
当然也可以每次移动2k个位置。然后运用双指针,把开头和到k位置的字符翻转
发表评论