Rotate string counterclockwise
for(int j=0;j&lt;i;j++){
        prefix.append(s.charAt(s.length()-1-j));
    }



An easy optimization is to change this to 

    for (int j = 1; j &lt;= i; j++) {
        prefix.append(s.charAt(s.length() - j));
    }


You can go further if you like, e.g. 

    for (int j = s.length() - 1, m = s.length - i; j &gt;= m; j--) {
        prefix.append(s.charAt(j));
    }


But if you're doing that, you might as well change 


public static String rotateAntiClockWise(String s, int offset){
    int i = offset%s.length();
    StringBuffer prefix = new StringBuffer();
    for(int j=0;j&lt;i;j++){
        prefix.append(s.charAt(s.length()-1-j));
    }
    return prefix.append(s.substring(0, s.length()-i)).toString();
}



to 

public static String rotateAntiClockWise(String s, int offset){
    int i = s.length() - (offset % s.length());
    StringBuffer prefix = new StringBuffer();

    for (int j = s.length() - 1; j &gt;= i; j--) {
        prefix.append(s.charAt(j));
    }

    return prefix.append(s.substring(0, i)).toString();
}


Now we only subtract from s.length() twice.  Before we subtracted from it i + 1 times.  

But I actually think that the best version is 

public static String rotateAntiClockWise(String s, int offset){
    int i = s.length() - (offset % s.length());
    StringBuffer prefix = new StringBuffer(s.substring(i));

    return prefix.reverse().append(s.substring(0, i)).toString();
}


Now I can easily read this and see that we are reversing the last part of the string and appending the first part.  

I'm not really feeling the rotateAntiClockWise name.  That's not really what we're doing.  We're more mirrorSuffixToPrefix or something.