1. 程式人生 > >leadcode 541. Reverse String II

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);
    }
}