541. Reverse String II

541. Reverse String II

  • Description

Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original.

Example:

Input: s = "abcdefg", k = 2
Output: "bacdfeg"

Restrictions:

  1. The string consists of lower English letters only.
  2. Length of the given string and k will in the range [1, 10000]
class Solution {
    public String reverseStr(String s, int k) {
             char[] chars=s.toCharArray();
            int time=s.length()/(2*k);
            System.out.println(time);
            char temp;
            if(time>0){
                for(int i=0;i<time;i++){//change ki ki+1 ki+2....ki+k-1
                    for(int x=0;x<(k/2);x++)
                    {
                        temp=chars[2*k*i+x];
                        chars[2*k*i+x]=chars[2*k*i+k-1-x];
                        chars[2*k*i+k-1-x]=temp;
                    }
                }
            }
            //change 2k*time-1 2k*time...
            int left=s.length()-2*k*time;//剩下的数组个数
            //2k*time-1 2k*time .....2k*time+left-1
            if(left<k){
                for(int x=0;x<(left/2);x++){
                    temp=chars[2*k*time+x];
                    chars[2*k*time+x]=chars[2*k*time-1+left-x];
                    chars[2*k*time-1+left-x]=temp;
                }
            }else{//left>k
                for(int x=0;x<(k/2);x++){
                    temp=chars[2*k*time+x];
                    chars[2*k*time+x]=chars[2*k*time-1+k-x];
                    chars[2*k*time-1+k-x]=temp;
                }
            }
           return new String(chars);
    }
}

improve

class Solution {
 public String reverseStr(String s, int k) {
            char[] chars=s.toCharArray();
            int time=s.length()/(2*k);
            if(time>0){
                for(int i=0;i<time;i++){
                        chars=sort(chars,2*k*i,2*k*i+k-1);  
                }       
            }
            int left=s.length()-2*k*time;
            int e=left<k?left:k;
            if(e>0){
                 chars=sort(chars,2*k*time,2*k*time+e-1);
            }  
           return new String(chars);
        }


    public char[] sort(char[] chars,int s,int e){
        //对chars[],start和end之间倒序
        int l=e-s+1;
        char temp;
        for(int i=0;i<(l/2);i++){
            temp=chars[s+i];
            chars[s+i]=chars[e-i];
            chars[e-i]=temp;
        }
        return chars;

     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值