我们今天分享的题目是字符串反转的进阶版反转字符串Ⅱ。
我们首先来看题目描述:
乍一看题目,有种懵逼的感觉,不要慌,博主来带着你分析题目,题目要求:
1. 每隔2k个字符,就对2k字符中的前k个字符进行反转;
2. 如果遍历2k后剩余的字符少于了k,就对剩余字符进行反转;
3. 如果剩余字符小于2k但大于等于k个,则反转前k个字符。
具体是什么意思么,我们来举例说明。
假如我们的字符串为“abcdefgh”
,k为3,2*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);}
}
那么本次的题目分享就到这里结束了,如果对本道题有疑问欢迎在博客下方留言,如果觉得博主写的博客对你有帮助,麻烦给博主点个小爱心谢谢。