给定一个字符串 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
  • 双指针
  • 字符串
  • \n
  • 👍 164
  • 👎 0
  • 题解

    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位置的字符翻转