给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
对于字符串 "abcdefg"
.
offset=0 => "abcdefg" offset=1 => "gabcdef" offset=2 => "fgabcde"
offset=3 => "efgabcd"
/* http://www.cnblogs.com/bakari/archive/2012/09/09/2677155.html 思路二:三次反转 2 * e.g: "abcd1234" 第一次反转:"dcba", 第二次反转:"4321", 第三次反转:“1234abcd” 算法的时间复杂度降到线性级为O(N); 前部分逆序,后部分逆序,整体逆序, 这里注意的是offeset会大于字符串长度的情况, 所以要对offeset处理:offeset = offeset%len*/ public class Solution { public void rotateString(char[] str, int offset) { // write your code here if (str == null || str.length == 0) return; //面N表示字符串的长度,K表示要循环移动的位数,注意对K的处理上,K有可能比N大,如果K == N,刚好回到原来的字符串,即没有移动,所以,我们可以用K %= N来代替K,效果是一样的。 offset = offset % str.length; int len = str.length; //先反转前半部分 reverse(str, 0, len - offset - 1); //反转后半部分 reverse(str, len - offset, len - 1); //整体反转 reverse(str, 0, len - 1); } private void reverse(char[] str, int start, int end) { for (int i = start, j = end; i < j; i++, j--) { char temp = str[i]; str[i] = str[j]; str[j] = temp; } } } //此思路是最容易想到的,就是进行简单的替换,覆盖和插入操作。