剑指43.左旋转字符串
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路
思路1:字符串翻转的应用。左旋转可以看成是字符串翻转两次,例子——输入字符串abcdefg,左移2位
第一次翻转整个字符串,让每个子序列处于合适的位置;例如,abcdefg → gfedcba
第二次翻转两个子序列,消除第一次翻转对每个子序列内部位置的影响。例如上一步得到gfedcba,对两个子序列分别翻转,gfedc→cdefg、ba→ab,再合并起来 cdefgab。
Note:这两次翻转也可以调换顺序,第一次分别翻转两个子序列,得到bagfedc;第二次翻转整个字符串得到cdefgab。
思路2:截取字符串。
注意:本题的边界条件!!n 可能 大于字符串的长度,因此稳妥起见传入的 n 先做 n = n % str.length();
解法1.1(手写reverse())
public class Solution { public String LeftRotateString(String str,int n) { if (str == null || str.length() ==0 || n <= 0) // 最全的边界条件 return str; n = n % str.length(); char[] chars = str.toCharArray(); // 第一种翻转顺序 reverse(chars,0,n-1); reverse(chars,n,str.length()-1); reverse(chars,0,str.length()-1); // 第二种翻转顺序 /*reverse(chars,0,str.length()-1); reverse(chars,0,str.length()-n-1); reverse(chars,str.length()-n,str.length()-1);*/ return String.valueOf(chars); } 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--; } } }
解法1.2(调用reverse())
public class Solution { // 版本1:先对整个字符串翻转,再分别翻转两个子字符串 public String LeftRotateString(String str,int n) { if (str.length() == 0) return ""; n = n % str.length(); StringBuilder flipStr = new StringBuilder(str).reverse();// 第一次对整个字符串进行翻转 String str1 = flipStr.substring(0,str.length() - n); //左闭右开 String str2 = flipStr.substring(str.length() - n); //默认到字符串最后 return new StringBuilder(str1).reverse().append(new StringBuilder(str2).reverse()).toString(); // 第二次分别翻转 } // 版本2:先分别翻转两个子字符串,再对整个字符串翻转 public String LeftRotateString(String str,int n) { if (str.length() == 0) return ""; n = n % str.length(); String str1 = str.substring(0,n); String str2 = str.substring(n); return new StringBuilder(str1).reverse().append(new StringBuilder(str2).reverse()).reverse().toString(); } }
解法2
public class Solution { public String LeftRotateString(String str,int n) { if (str.length() == 0) return ""; n = n % str.length(); return str.substring(n) + str.substring(0,n); } }
自己写的弱鸡添加法
public class Solution { public String LeftRotateString(String str,int n) { if (str.length() == 0) return str; StringBuilder sb = new StringBuilder(); for (int i = n; i < str.length(); i++) sb.append(str.charAt(i)); for (int i = 0; i < n; i++) sb.append(str.charAt(i)); return sb.toString(); } }