彙編語言中有一種移位指令叫作循環左移(ROL),如今有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。
例如,字符序列S=」abcXYZdef」,要求輸出循環左移3位後的結果,即「XYZdefabc」。是否是很簡單?OK,搞定它!java
三次翻轉。
時間複雜度O(n),空間複雜度O(1)。數組
import java.util.Arrays; public class Solution { private void reverse(char[] cs, int low, int high) { char tmp; // 折半時須要包括等於,以兩個數爲例,須要選取下標=1 for(int i = low; i <= (low + high) / 2; i++) { tmp = cs[i]; cs[i] = cs[high - i + low]; cs[high - i + low] = tmp; } } public String LeftRotateString(String str, int n) { if(str == null || str.length() == 0 || n < 1) return str; char[] cs = str.toCharArray(); reverse(cs, 0, n-1); reverse(cs, n, str.length() - 1); reverse(cs, 0, str.length() - 1); return String.valueOf(cs); } }
直接返回cs.toString()返回的是"[C@7d4991ad"一類的字符串,[C表示char數組類型。
char數組類型的元素直接調用toString()函數,實際調用的是從Object類繼承的toString()函數。
Object類toString函數源碼:函數
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
除了使用String.valueOf函數返回,還可使用:code
return new String(cs);
實際就是String.valueOf的源碼:繼承
public static String valueOf(char data[]) { return new String(data); }