反转字符串II(541)

题目描述

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

解题思路

如果按照我们暴力解法的话我们肯定是想一个一个的for循环去遍历,其实这道题说了每次是以2k的进度往前跳跃的,我们可以每次以2k为单位向前移动,然后在做一些边界处理,整体代码不是很难理解,主要是要考虑好各种细节问题,这个你可以自己多尝试提交几次就可以不断的去完善

import java.util.*;
class Solution {
    public String reverseStr(String s, int k) {
        StringBuilder result=new StringBuilder();
        StringBuilder temp;
        for(int i=0;i<s.length();i+=2*k){
            //这一步是处理你的字符串长度可能连轮一个来回都不够的情况
            if(i==0 && s.length()<k){
                temp=new StringBuilder();
             result.append(temp.append(s.substring(i,s.length())).reverse().toString());
                break;
            }else if( i==0 && k<=s.length() && s.length()<2*k ){
                temp=new StringBuilder();
                temp.append(s.substring(i,i+k));
                result.append(temp.reverse().toString());
                result.append(s.substring(i+k,s.length()));
                break;
            }
			//进行反转前k个字符,然后剩余的原封不动的复制下来
            temp=new StringBuilder();
            temp.append(s.substring(i,i+k));
            result.append(temp.reverse().toString());
            result.append(s.substring(i+k,i+2*k));

            //处理不够下一个轮回的情况,就是题目说的那两种种情况
            if( (s.length()-(i+2*k))<k){
                temp=new StringBuilder();
                result.append(temp.append(s.substring(i+2*k,s.length())).reverse().toString());
                break;
            }else if( k<=(s.length()-(i+2*k)) && (s.length()-(i+2*k))<2*k ){
                temp=new StringBuilder();
                temp.append(s.substring(i+2*k,i+2*k+k));
                result.append(temp.reverse().toString());
                result.append(s.substring(i+2*k+k,s.length()));
                break;
            }


        }

        return result.toString();
    }
}
···

热门相关:医门宗师   重生之男神追妻忙   傲天弃少   国民女神:重生王牌千金   神秘复苏