leadcode 541. Reverse String II

 

 

package leadcode;

/**
 * 541. Reverse String II
 * Easy
 * 199
 * 575
 *
 *
 * 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:
 * The string consists of lower English letters only.
 * Length of the given string and k will in the range [1, 10000]
 */
public class L541 {
    public String reverseStr(String s, int k) {
        StringBuilder sb = new StringBuilder();
        int len = s.length();
        int count = len/(2*k)-1;
        int remaining = len%(2*k);
        if (remaining!=0){
            count = count+1;
        }
        for (int i=0;i<=count;i++){
            if(remaining!=0 && i==count){
                int cout2k = 2*k*(i+1);
                int coutk =  2*k*i+k;
                if(len<coutk){
                    StringBuilder sb3 = reverse(s,2*k*i,len);
                    sb.append(sb3);
                }else if(len<cout2k){
                    StringBuilder sb3 = reverse(s,2*k*i,coutk);
                    sb.append(sb3);
                    StringBuilder sb4 = retain(s,coutk,len);
                    sb.append(sb4);
                }
            }else {
                StringBuilder sb1 = reverse(s,2*k*i,2*k*i+k);
                sb.append(sb1);
                StringBuilder sb2 = retain(s,2*k*i+k,2*k*(i+1));
                sb.append(sb2);
            }
        }
        return new String(sb);
    }

    private StringBuilder reverse(String s,int begin,int end){
        return new StringBuilder(s.substring(begin,end)).reverse();
    }

    private StringBuilder retain(String s,int begin,int end){
        return new StringBuilder(s.substring(begin,end));
    }

}

 

 

class Solution {
public String reverseStr(String s, int k) {
        char[] str=s.toCharArray();
        int i;
        int len=str.length;
        for(i=0;i<len;i+=2*k){
            if(i+k-1 >= len || i+(2*k)-1 >= len)
                break;
            reverse(str,i,i+k-1);
        }
        // if < 2k 
        if(i+k-1 < len)
            reverse(str,i,i+k-1);
    // if < k
        else if(i< len && i+k-1 >= len)
            reverse(str,i,len-1);
            
        return new String(str);
    }
    public void reverse(char[] str, int i, int j){
        while(i<j){
            char temp=str[i];
            str[i]=str[j];
            str[j]=temp;
            i++;
            j--;
        }
        
    }
}

 

 

class Solution {
    public String reverseStr(String s, int k) {
        char[] a = s.toCharArray();
        for (int start = 0; start < a.length; start += 2 * k) {
            int i = start, j = Math.min(start + k - 1, a.length - 1);
            while (i < j) {
                char tmp = a[i];
                a[i++] = a[j];
                a[j--] = tmp;
            }
        }
        return new String(a);
    }
}

 

转载于:https://www.cnblogs.com/chengpeng15/p/10034020.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值