zoukankan      html  css  js  c++  java
  • [leetCode]541. 反转字符串 II

    csdn:https://blog.csdn.net/renweiyi1487/article/details/109330386

    题目

    链接:https://leetcode-cn.com/problems/reverse-string-ii

    给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

    如果剩余字符少于 k 个,则将剩余字符全部反转。
    如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

    示例:
    
    输入: s = "abcdefg", k = 2
    输出: "bacdfeg"
     
    
    提示:
    
    该字符串只包含小写英文字母。
    给定字符串的长度和 k 在 [1, 10000] 范围内。
    

    双指针

    思路:计算字符串一共能以2k的长度分为几段,然后按照每段进行反转。每段处理完成后按照规则处理剩余部分。

    class Solution {
        public String reverseStr(String s, int k) {
            char[] chars = s.toCharArray();
            int n = chars.length;
            int section = n / (2*k);
            int  i = 0;
            while (i  < section) {
                int begin = i * 2 * k;
                int end = begin + k - 1;
                reverse(chars, begin, end);
                i++;
            }
            int leaveLen = n - (i * 2 * k);
            if (leaveLen <= k) {
                reverse(chars, i * 2 * k, n - 1);
            } else if (leaveLen < 2 * k && leaveLen >= k) {
                reverse(chars, i *2 * k, i * 2 * k + k - 1);
            }
            return new String(chars);
        }
    
        private void reverse(char[] chars, int begin, int end) {
            while (begin < end) {
                char temp = chars[begin];
                chars[begin] = chars[end];
                chars[end] = temp;
                begin++;
                end--;
            }
        }
    }
    

    另外一种写法,利用for循环分段处理

    在for循环中利用i += (2 * k)即可分段处理

    class Solution {
        public String reverseStr(String s, int k) {
            char[] chars = s.toCharArray();
            int n = chars.length;
            for (int i = 0; i < n; i += 2*k) {
                // 1. 每隔 2k 个字符的前 k 个字符进行反转
                // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符
                if (i + k <= n) {
                    reverse(chars, i, i + k - 1);
                    continue;
                }
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(chars, i,n-1);
            }
            return new String(chars);
        }
    
        private void reverse(char[] chars, int begin, int end) {
            while (begin < end) {
                char temp = chars[begin];
                chars[begin] = chars[end];
                chars[end] = temp;
                begin++;
                end--;
            }
        }
    }
    
  • 相关阅读:
    HGOI20191115 模拟赛 题解
    HGOI20191114 CSP模拟赛 反思
    HGOI 20191108 题解
    HGOI 20191107 题解
    HGOI 20191106 题解
    HGOI 20191105 题解
    HGOI 20191103am 题解
    HGOI 20191101am 题解
    HGOI 20191031am 题解
    新的博客!!!
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13890451.html
Copyright © 2011-2022 走看看