练手系列之旋转字符串
题目如下:
把字符串前面的若干个字符移动到字符串的尾部。
例如把字符串abcdef左旋转2位得到字符串cdefab。
贴上java版的实现:
1 /** 2 * 整个数组移位 3 * @param str 4 * @param k 5 * @return 6 */ 7 private static String rotate1(String str, int k) { 8 if (str == null || str.length() == 0) { 9 return null; 10 } else if (k == str.length() || k == 0) { 11 return str; 12 } 13 // 防止k大于字符串长度 14 k = k % str.length(); 15 char[] chs = str.toCharArray(); 16 if (k <= str.length() / 2) { 17 // 左旋转 18 while (k > 0) { 19 char tmp = chs[0]; 20 for (int i = 0; i < chs.length - 1; i++) { 21 chs[i] = chs[i + 1]; 22 } 23 chs[chs.length - 1] = tmp; 24 k--; 25 } 26 } else { 27 // 右旋转 28 k = chs.length - k; 29 while (k > 0) { 30 char tmp = chs[chs.length - 1]; 31 for (int i = chs.length - 1; i > 0; i--) { 32 chs[i] = chs[i - 1]; 33 } 34 chs[0] = tmp; 35 k--; 36 } 37 } 38 return String.valueOf(chs); 39 } 40 41 /** 42 * 字符串翻转 43 * @param str 44 * @param k 45 * @return 46 */ 47 private static String rotate2(String str, int k) { 48 char[] chs = str.toCharArray(); 49 if (str == null || str.length() == 0) { 50 return null; 51 } else if (k == str.length() || k == 0) { 52 return str; 53 } 54 reverse(chs, 0, k - 1); 55 reverse(chs, k, str.length() - 1); 56 reverse(chs, 0, chs.length - 1); 57 return String.valueOf(chs); 58 } 59 60 private static void reverse(char[] chs, int start, int end) { 61 while (start < end) { 62 char tmp = chs[start]; 63 chs[start] = chs[end]; 64 chs[end] = tmp; 65 start++; 66 end--; 67 } 68 }