是不是很简单?OK,搞定它!

是不是很简单?OK,搞定它! 这道题⽬的意思就是将前⾯ n 位移动到后⾯那么我们可以直接从第 n1 位开始遍历到最后⼀个再拼接上前⾯ n 个。暴力移位通过k次单步左移实现循环左移。将第一个字符保存其余字符前移最后字符放到末尾javapublic class Solution { public String leftRotateString(String str, int n) { if (str null || str.length() 0 || n 0) { return str; } char[] chars str.toCharArray(); int len chars.length; n % len; // 处理n大于字符串长度的情况 // 执行n次单步左移 for (int k 0; k n; k) { // 单步左移保存首字符其余前移最后放回首字符 char firstChar chars[0]; for (int i 0; i len - 1; i) { chars[i] chars[i 1]; } chars[len - 1] firstChar; } return new String(chars); } }时间复杂度O(k×n)其中k为移动次数n为字符串长度空间复杂度O(1)只使用固定额外空间字符串切片法推荐值得注意的是 n 可能⼤于 str 的⻓度那么这种情况下我们应该先对 str 的⻓度取余保持严谨。即是 n n % str.length(); 。javapublic class Solution { public String LeftRotateString(String str, int n) { if (str null || str.length() 0 || n 0) { return str; } String ret ; n n % str.length(); for (int i n; i str.length(); i) { ret str.charAt(i); } for (int i 0; i n; i) { ret str.charAt(i); } return ret; } }时间复杂度 O(n)空间复杂度 O(n) 。或者可以用substring 的APIjavapublic class Solution { public String leftRotateString(String str, int n) { if (str null || str.length() 0 || n 0) { return str; } int len str.length(); n % len; // 处理n大于字符串长度的情况 // 直接截取并拼接后部分 前部分 return str.substring(n) str.substring(0, n); } }时间复杂度O(n)substring操作需要线性时间空间复杂度O(n)创建新的字符串对象三次反转数学优美利用数学规律BA (AB)通过三次反转实现循环左移。分别反转前n位、剩余部分最后整体反转javapublic class Solution { public String leftRotateString(String str, int n) { if (str null || str.length() 0 || n 0) { return str; } char[] chars str.toCharArray(); int len chars.length; n % len; if (n 0) return str; // 移动0位直接返回 // 第一步反转前n个字符 reverse(chars, 0, n - 1); // 第二步反转剩余字符 reverse(chars, n, len - 1); // 第三步整体反转 reverse(chars, 0, len - 1); return new String(chars); } /** * 反转字符数组中指定范围的字符 * param chars 字符数组 * param start 起始索引 * param end 结束索引 */ private void reverse(char[] chars, int start, int end) { while (start end) { // 交换首尾字符 char temp chars[start]; chars[start] chars[end]; chars[end] temp; start; end--; } }