Leetcode541反转字符串Ⅱ(java实现)

我们今天分享的题目是字符串反转的进阶版反转字符串Ⅱ。
我们首先来看题目描述:
Leetcode541反转字符串Ⅱ(java实现)_第1张图片
乍一看题目,有种懵逼的感觉,不要慌,博主来带着你分析题目,题目要求:

1. 每隔2k个字符,就对2k字符中的前k个字符进行反转;
2. 如果遍历2k后剩余的字符少于了k,就对剩余字符进行反转;
3. 如果剩余字符小于2k但大于等于k个,则反转前k个字符。

具体是什么意思么,我们来举例说明。
假如我们的字符串为“abcdefgh”k为32*k=6,此时的元素是f,那么我们应该对对2k的前k个字符进行反转,也就是对前3个元素“abc”反转,反转后为“cbadefgh”,此时我们遍历2k后剩余的字符小于了k(剩余gh,k为3),我们对剩余的字符反转,最后就为"cbadefhg"
要求3实际上和要求1做的是同一个事情,就是对前k个字符反转
我们来说下我们代码的实现大致思路:
首先,我们对字符串进行遍历,每次以2*k为遍历段,也就是一次循环遍历2*k个元素,如果说遍历2k后的字符串大于等于2k那么对i到i+k的字符串进行反转,如果遍历2k后字符串小于了2k那么对剩余的字符串进行反转。
具体的代码实现如下(本道题对边界的处理原则是左闭右开):

class Solution {
    /**
     * Leetcode541反转字符Ⅱ
     */
    //字符反转
    void restr(char[] chars,int i,int k){
      while (i<k){
       char tem;
       tem=chars[i];
       chars[i]=chars[k];
       chars[k]=tem;
       i++;
       k--;
      }
   }
    public  String reverseStr(String s, int k) {
        int i =0;
        char[] chars = s.toCharArray();
        //每次遍历2*k个元素
        for (i=0;i<chars.length;i+=2*k){
            //要求1和要求3其实是一样的对前k个字符进行反转,那么我们只需要
            //判断不要让i+k出现越界
            if (i+k<s.length()){
                //反转前k个字符
                restr(chars,i,i+k-1);
            }else {
                //反转剩余的字符
                restr(chars,i,chars.length-1);
            }
        }
        return new String(chars);
    }
}

那么本次的题目分享就到这里结束了,如果对本道题有疑问欢迎在博客下方留言,如果觉得博主写的博客对你有帮助,麻烦给博主点个小爱心谢谢。

你可能感兴趣的:(java,算法,开发语言,数据结构)